OSDN Git Service

323
[psychlops/silverlight.git] / dev4 / psychlops / core / math / interval.cs
index 0b9a22d..843338f 100644 (file)
@@ -9,7 +9,7 @@ namespace Psychlops
                public enum OPERATOR { CLOSE, OPEN };\r
                public const OPERATOR CLOSE = OPERATOR.CLOSE, OPEN = OPERATOR.OPEN;\r
                public struct VAL {\r
-                       public double val;\r
+                       public double value;\r
                        public OPERATOR op;\r
                        /*public VAL()\r
                        {\r
@@ -18,12 +18,12 @@ namespace Psychlops
                        }*/\r
                        public VAL(double v, OPERATOR o)\r
                        {\r
-                               val = v;\r
+                               value = v;\r
                                op = o;\r
                        }\r
                        public bool bounded()\r
                        {\r
-                               return !Double.IsNaN(val) && (!Double.IsInfinity(val) || op == OPERATOR.OPEN);\r
+                               return !Double.IsNaN(value) && (!Double.IsInfinity(value) || op == OPERATOR.OPEN);\r
                        }\r
                }\r
                public VAL begin, end;\r
@@ -36,43 +36,65 @@ namespace Psychlops
                }*/\r
                public Interval(double floor_val, double ceil_val)\r
                {\r
-                       begin.val = floor_val;\r
+                       begin.value = floor_val;\r
                        begin.op =  OPERATOR.CLOSE;\r
-                       end.val = ceil_val;\r
+                       end.value = ceil_val;\r
                        end.op = OPERATOR.CLOSE;\r
                }\r
                public Interval(double floor_val, OPERATOR floor_op, double ceil_val, OPERATOR ceil_op)\r
                {\r
-                       begin.val = floor_val;\r
+                       begin.value = floor_val;\r
                        begin.op = floor_op;\r
-                       end.val = ceil_val;\r
+                       end.value = ceil_val;\r
                        end.op = ceil_op;\r
                }\r
 \r
-               /*\r
-               public int int_floor();\r
-               public int int_floor(int minval);\r
-               public int int_ceil();\r
-               public int int_ceil(int maxval);\r
-               */\r
+\r
+               public int int_floor()\r
+               {\r
+                       double v = Math.ceil(begin.value);\r
+                       if (begin.op == OPEN && v == begin.value) { return (int)v + 1; }\r
+                       else return (int)v;\r
+               }\r
+               public int int_floor(int minval)\r
+               {\r
+                       if(begin.value<minval) return minval;\r
+                       double v = Math.ceil(begin.value);\r
+                       if (begin.op == OPEN && v == begin.value) { return (int)v + 1; }\r
+                       else return (int)v;\r
+               }\r
+               public int int_ceil()\r
+               {\r
+                       double v = Math.floor(end.value);\r
+                       if (end.op == OPEN && v == end.value) { return (int)v - 1; }\r
+                       else return (int)v;\r
+               }\r
+               public int int_ceil(int maxval)\r
+               {\r
+                       if(end.value>maxval) return maxval;\r
+                       double v = Math.floor(end.value);\r
+                       if (end.op == OPEN && v == end.value) { return (int)v - 1; }\r
+                       else return (int)v;\r
+               }\r
+               \r
                bool includes(double val)\r
                {\r
                        bool result = false;\r
                        switch(begin.op) {\r
                                case OPERATOR.CLOSE:\r
-                               result = begin.val<=val ? true : false;\r
-                               break;\r
+                                       result = begin.value <= val ? true : false;\r
+                                       break;\r
                                case OPERATOR.OPEN:\r
-                               result = begin.val<val ? true : false;\r
-                               break;\r
+                                       result = begin.value < val ? true : false;\r
+                                       break;\r
                        }\r
                        switch(end.op) {\r
                                case OPERATOR.CLOSE:\r
-                               result = result && ( end.val>=val ? true : false );\r
-                               break;\r
+                                       result = result && (end.value >= val ? true : false);\r
+                                       break;\r
                                case OPERATOR.OPEN:\r
-                               result = result && ( end.val>val ? true : false );\r
-                               break;\r
+                                       result = result && (end.value > val ? true : false);\r
+                                       break;\r
                        }\r
                        return result;\r
                }\r
@@ -88,13 +110,13 @@ namespace Psychlops
                        //                      return new IntervalIEnumerable(this, steps);\r
                        Interval it = this;\r
                        long front_step = (it.begin.op == Interval.OPERATOR.CLOSE ? -1 : 0);\r
-                       long back_step = (long)System.Math.Floor((it.end.val - it.begin.val) / steps);\r
-                       if (it.end.op == Interval.OPERATOR.OPEN && 0 == System.Math.IEEERemainder(it.end.val - it.begin.val, steps))\r
+                       long back_step = (long)System.Math.Floor((it.end.value - it.begin.value) / steps);\r
+                       if (it.end.op == Interval.OPERATOR.OPEN && 0 == System.Math.IEEERemainder(it.end.value - it.begin.value, steps))\r
                        {\r
                                back_step -= 1;\r
                        }\r
                        while (front_step <= back_step)\r
-                               yield return steps * front_step + it.begin.val;\r
+                               yield return steps * front_step + it.begin.value;\r
                }\r
 \r
 \r
@@ -147,35 +169,35 @@ namespace Psychlops
 \r
                        public static IntervalAcc operator <(double val, IntervalAcc rng)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.val, rng.instance.end.op) };\r
+                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.value, rng.instance.end.op) };\r
                        }\r
                        public static IntervalAcc operator <=(double val, IntervalAcc rng)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.val, rng.instance.end.op) };\r
+                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.value, rng.instance.end.op) };\r
                        }\r
                        public static IntervalAcc operator >(double val, IntervalAcc rng)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };\r
+                               return new IntervalAcc { instance = new Interval(rng.instance.begin.value, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };\r
                        }\r
                        public static IntervalAcc operator >=(double val, IntervalAcc rng)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };\r
+                               return new IntervalAcc { instance = new Interval(rng.instance.begin.value, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };\r
                        }\r
                        public static IntervalAcc operator <(IntervalAcc rng, double val)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };\r
+                               return new IntervalAcc { instance = new Interval(rng.instance.begin.value, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };\r
                        }\r
                        public static IntervalAcc operator <=(IntervalAcc rng, double val)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };\r
+                               return new IntervalAcc { instance = new Interval(rng.instance.begin.value, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };\r
                        }\r
                        public static IntervalAcc operator >(IntervalAcc rng, double val)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.val, rng.instance.end.op) };\r
+                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.value, rng.instance.end.op) };\r
                        }\r
                        public static IntervalAcc operator >=(IntervalAcc rng, double val)\r
                        {\r
-                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.val, rng.instance.end.op) };\r
+                               return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.value, rng.instance.end.op) };\r
                        }\r
 \r
                        public static implicit operator Interval(IntervalAcc rhs)\r