OSDN Git Service

323
authorHOSOKAWA Kenchi <hskwk@inter7.jp>
Sun, 22 Aug 2010 02:47:31 +0000 (11:47 +0900)
committerHOSOKAWA Kenchi <hskwk@inter7.jp>
Sun, 22 Aug 2010 02:47:31 +0000 (11:47 +0900)
dev4/psychlops/core/graphic/canvas.cs
dev4/psychlops/core/math/interval.cs
dev4/psychlops/core/math/matrix.cs
dev4/psychlops/core/math/util.cs
dev4/psychlops/extention/compatibility/compatibility.cs [new file with mode: 0644]
dev4/psychlops/extention/math/solver.cs
dev4/psychlops/extention/standard/widget.cs

index c129d82..be3cbae 100644 (file)
@@ -31,21 +31,21 @@ namespace Psychlops
                {\r
 //                     protected System.Collections.Generic.Queue<Internal.PrimitiveFigure> stack;\r
                        internal Internal.PrimitiveFigure[] stack;\r
-                       internal int stackN;\r
+                       internal int stackN = 0;\r
                        internal Line[] lineStack;\r
-                       internal int lineStackN;\r
+                       internal int lineStackN = 0;\r
                        internal Rectangle[] rectStack;\r
-                       internal int rectStackN;\r
+                       internal int rectStackN = 0;\r
                        internal Ellipse[] ellipseStack;\r
-                       internal int ellipseStackN;\r
+                       internal int ellipseStackN = 0;\r
                        internal Polygon[] polygonStack;\r
-                       internal int polygonStackN;\r
+                       internal int polygonStackN = 0;\r
                        internal Letters[] lettersStack;\r
-                       internal int lettersStackN;\r
+                       internal int lettersStackN = 0;\r
                        internal Image[] imageStack;\r
-                       internal int imageStackN;\r
+                       internal int imageStackN = 0;\r
                        internal Group[] groupStack;\r
-                       internal int groupStackN;\r
+                       internal int groupStackN = 0;\r
 \r
 \r
                        public StackableDrawable()\r
@@ -648,7 +648,7 @@ namespace Psychlops
                        api_canvas = default_api_canvas;\r
                        initialize(500, 500);\r
                }\r
-               public Canvas(Mode mod)\r
+               public Canvas(Mode mod) : base()\r
                {\r
                        panel = default_panel;\r
                        api_canvas = default_api_canvas;\r
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
index 9bd895f..de4a836 100644 (file)
@@ -13,11 +13,25 @@ namespace Psychlops
                }\r
 \r
                /*\r
+               public abstract Internal.MatrixExpression this[Interval row, Interval col]\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
+\r
+\r
+               /*\r
                public static Matrix operator +(Matrix m, double d)\r
                {\r
                        return new Internal.MatrixExpression();\r
                }\r
                */\r
+\r
+               public abstract int rows { get; }\r
+               public abstract int cols { get; }\r
+               public int getRows() { return rows; }\r
+               public int getCols() { return cols; }\r
+\r
        }\r
 \r
 \r
@@ -26,41 +40,56 @@ namespace Psychlops
 \r
                public class MatrixImplementation : Matrix\r
                {\r
-                       internal double[] elements;\r
-                       readonly int nrow, ncol;\r
+                       internal double[,] elements;\r
 \r
                        public MatrixImplementation(int dnrow, int dncol)\r
                        {\r
-                               nrow = dnrow;\r
-                               ncol = dncol;\r
-                               elements = new double[nrow * ncol];\r
+                               elements = new double[dnrow, dncol];\r
                        }\r
 \r
                        public override double this[int row, int col]\r
                        {\r
                                get\r
                                {\r
-                                       return elements[(row - 1) * ncol + (col - 1)];\r
+                                       return elements[row - 1, col - 1];\r
                                }\r
                                set\r
                                {\r
-                                       elements[(row - 1) * ncol + (col - 1)] = value;\r
+                                       elements[row - 1, col - 1] = value;\r
                                }\r
                        }\r
+                       /*\r
+                       public override MatrixExpression this[Interval row, Interval col]\r
+                       {\r
+                               get\r
+                               {\r
+                                       return new MatrixExpression(this, row.int_floor(), col.int_floor(), row.int_ceil(), col.int_ceil());\r
+                               }\r
+                               set\r
+                               {\r
+                                       for(int r = 0, r<)\r
+                                       elements[row - 1, col - 1] = value;\r
+                               }\r
+                       }\r
+                        * */\r
+\r
+                       public override int rows { get { return elements.GetLength(0); } }\r
+                       public override int cols { get { return elements.GetLength(1); } }\r
+\r
                }\r
 \r
                public class MatrixExpression : Matrix\r
                {\r
                        MatrixImplementation imp;\r
-                       readonly int nrow, ncol;\r
-                       readonly int drow, dcol;\r
-                       \r
-                       public MatrixExpression(MatrixImplementation target, int ddrow, int ddcol, int dnrow, int dncol)\r
+                       readonly int brow, bcol;\r
+                       readonly int erow, ecol;\r
+\r
+                       internal MatrixExpression(MatrixImplementation target, int dbrow, int dbcol, int derow, int decol)\r
                        {\r
-                               nrow = dnrow;\r
-                               ncol = dncol;\r
-                               drow = ddrow;\r
-                               dcol = ddcol;\r
+                               brow = dbrow;\r
+                               bcol = dbcol;\r
+                               erow = derow;\r
+                               ecol = decol;\r
                                imp = target;\r
                        }\r
 \r
@@ -68,13 +97,16 @@ namespace Psychlops
                        {\r
                                get\r
                                {\r
-                                       return imp.elements[(row - drow) * ncol + (col - dcol)];\r
+                                       return imp.elements[(row - 1 - brow), (col - 1 - bcol)];\r
                                }\r
                                set\r
                                {\r
-                                       imp.elements[(row - drow) * ncol + (col - dcol)] = value;\r
+                                       imp.elements[(row - 1 - brow), (col - 1 - bcol)] = value;\r
                                }\r
                        }\r
+\r
+                       public override int rows { get { return erow - brow + 1; } }\r
+                       public override int cols { get { return ecol - bcol + 1; } }\r
                }\r
        }\r
 \r
index 338423a..20886e0 100644 (file)
@@ -5,20 +5,20 @@ namespace Psychlops
 \r
        public static class Math\r
        {\r
-               public static readonly double PI = 3.14159265, E = 2.718281828459045, LOG2E = 1.44269504088896340736;\r
+               public const double PI = 3.14159265, E = 2.718281828459045, LOG2E = 1.44269504088896340736;\r
                public static Random random_generator;\r
                static Math()\r
                {\r
                        random_generator = new Random();\r
                }\r
 \r
-               public static double max(double val1, double val2)\r
+               public static T max<T>(T val1, T val2) where T : IComparable\r
                {\r
-                       return val1 > val2 ? val1 : val2;\r
+                       return val1.CompareTo(val2) > 0 ? val1 : val2;\r
                }\r
-               public static double min(double val1, double val2)\r
+               public static T min<T>(T val1, T val2) where T : IComparable\r
                {\r
-                       return val1 < val2 ? val1 : val2;\r
+                       return val1.CompareTo(val2) < 0 ? val1 : val2;\r
                }\r
                public static void shuffle<X>(X[] array, int n)\r
                {\r
@@ -41,6 +41,14 @@ namespace Psychlops
                {\r
                        return System.Math.Abs(x);\r
                }\r
+               public static double floor(double x)\r
+               {\r
+                       return System.Math.Floor(x);\r
+               }\r
+               public static double ceil(double x)\r
+               {\r
+                       return System.Math.Ceiling(x);\r
+               }\r
                public static double sin(double x)\r
                {\r
                        return System.Math.Sin(x);\r
@@ -53,6 +61,26 @@ namespace Psychlops
                {\r
                        return System.Math.Tan(x);\r
                }\r
+               public static double asin(double x)\r
+               {\r
+                       return System.Math.Asin(x);\r
+               }\r
+               public static double acos(double x)\r
+               {\r
+                       return System.Math.Acos(x);\r
+               }\r
+               public static double atan(double x)\r
+               {\r
+                       return System.Math.Atan(x);\r
+               }\r
+               public static double atan(double y, double x)\r
+               {\r
+                       return System.Math.Atan2(y, x);\r
+               }\r
+               public static double atan2(double y, double x)\r
+               {\r
+                       return System.Math.Atan2(y, x);\r
+               }\r
                public static double sqrt(double x)\r
                {\r
                        return System.Math.Sqrt(x);\r
@@ -69,11 +97,10 @@ namespace Psychlops
                {\r
                        return log(val) * LOG2E;\r
                }\r
-               /*public static int round(double val)\r
+               public static double round(double val)\r
                {\r
-                       double integer_part, particle = modf(val, &integer_part);\r
-                       return ((particle < 0.5 | (particle == 0.5 && (int)integer_part % 2 == 0)) ? (int)integer_part : (int)integer_part + 1);\r
-               }*/\r
+                       return System.Math.Round(val);\r
+               }\r
 \r
                public static double radius(double x, double y)\r
                {\r
diff --git a/dev4/psychlops/extention/compatibility/compatibility.cs b/dev4/psychlops/extention/compatibility/compatibility.cs
new file mode 100644 (file)
index 0000000..bedc26f
--- /dev/null
@@ -0,0 +1,41 @@
+\r
+\r
+\r
+namespace Psychlops\r
+{\r
+\r
+       public static class Display\r
+       {\r
+               public static void pix(int x, int y, Color col) { Main.canvas.pix(x, y, col); }\r
+               public static void line(Line drawee) { Main.canvas.line(drawee); }\r
+               public static void rect(Rectangle drawee) { Main.canvas.rect(drawee); }\r
+               public static void ellipse(Ellipse drawee) { Main.canvas.ellipse(drawee); }\r
+               public static void polygon(Polygon drawee) { Main.canvas.polygon(drawee); }\r
+               public static void letters(Letters drawee) { Main.canvas.letters(drawee); }\r
+               public static void image(Image drawee) { Main.canvas.image(drawee); }\r
+               public static void group(Group drawee) { Main.canvas.group(drawee); }\r
+\r
+\r
+               public static void msg(string str, double x, double y) { Main.canvas.msg(str, x, y, Color.white); }\r
+               public static void msg(string dstr, double x, double y, Color col) { Main.canvas.msg(dstr, x, y, col); }\r
+               public static void var<Type>(Type val, double x, double y) { Main.canvas.var(val, x, y, Color.white); }\r
+               public static void var<Type>(Type val, double x, double y, Color col) { Main.canvas.var(val, x, y, col); }\r
+\r
+\r
+\r
+               public static void clear(double lum) { Main.canvas.clear(lum); }\r
+               public static void clear(Color col) { Main.canvas.clear(col); }\r
+               public static void flip(int n = 1) { Main.canvas.flip(n); }\r
+\r
+               public static double width { get { return Main.canvas.width; } }\r
+               public static double height { get { return Main.canvas.height; } }\r
+               public static Point center { get { return Main.canvas.center; } }\r
+               public static double getWidth() { return width; }\r
+               public static double getHeight() { return height; }\r
+               public static Point getCenter() { return center; }\r
+               public static double getHCenter() { return Main.canvas.getHCenter(); }\r
+               public static double getVCenter() { return Main.canvas.getVCenter(); }\r
+               public static double getRefreshRate() { return Main.canvas.getRefreshRate(); }\r
+       }\r
+\r
+}\r
index 0a149ec..2bca111 100644 (file)
@@ -146,7 +146,7 @@ namespace Psychlops
                                double like = 1.0;\r
                                champ_like=0.0;\r
                                int L = data.length;\r
-                               for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])\r
+                               for (double a = itvl[0].begin.value; a < itvl[0].end.value; a += step[0])\r
                                {\r
                                        like = 1.0;\r
                                        for(int i=0; i<L; i++) {\r
@@ -167,9 +167,9 @@ namespace Psychlops
                                double like = 1.0;\r
                                champ_like = 0.0;\r
                                int L = data.length;\r
-                               for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])\r
+                               for (double a = itvl[0].begin.value; a < itvl[0].end.value; a += step[0])\r
                                {\r
-                                       for (double b = itvl[1].begin.val; b < itvl[1].end.val; b += step[1])\r
+                                       for (double b = itvl[1].begin.value; b < itvl[1].end.value; b += step[1])\r
                                        {\r
                                                like = 1.0;\r
                                                for (int i = 0; i < L; i++)\r
@@ -194,11 +194,11 @@ namespace Psychlops
                                double like = 1.0;\r
                                champ_like = 0.0;\r
                                int L = data.length;\r
-                               for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])\r
+                               for (double a = itvl[0].begin.value; a < itvl[0].end.value; a += step[0])\r
                                {\r
-                                       for (double b = itvl[1].begin.val; b < itvl[1].end.val; b += step[1])\r
+                                       for (double b = itvl[1].begin.value; b < itvl[1].end.value; b += step[1])\r
                                        {\r
-                                               for (double c = itvl[2].begin.val; c < itvl[2].end.val; c += step[2])\r
+                                               for (double c = itvl[2].begin.value; c < itvl[2].end.value; c += step[2])\r
                                                {\r
                                                        like = 1.0;\r
                                                        for (int i = 0; i < L; i++)\r
@@ -361,10 +361,10 @@ namespace Psychlops
                                        data.elems[i].comb = (int)Binomial.combination(data.elems[i].pos + data.elems[i].neg, data.elems[i].pos);\r
                                }\r
 \r
-                               for (int j = 0; j < Constants.LIMIT; j++) { step[j] = (itvl[j].end.val - itvl[j].begin.val) / 256.0; }\r
+                               for (int j = 0; j < Constants.LIMIT; j++) { step[j] = (itvl[j].end.value - itvl[j].begin.value) / 256.0; }\r
                                for (int i = 0; i < 4; i++)\r
                                {\r
-                                       l[i].itvl[0] = new Interval((itvl[0].begin.val) + (i * step[0] * 64), (itvl[0].begin.val) + ((i + 1) * step[0] * 64));\r
+                                       l[i].itvl[0] = new Interval((itvl[0].begin.value) + (i * step[0] * 64), (itvl[0].begin.value) + ((i + 1) * step[0] * 64));\r
                                        l[i].step[0] = step[0];\r
                                        for (int j = 1; j < Constants.LIMIT; j++)\r
                                        {\r
@@ -392,9 +392,9 @@ namespace Psychlops
                                double r, low, high;\r
                                for (int j = 0; j < Constants.LIMIT; j++)\r
                                {\r
-                                       r = itvl[j].end.val - itvl[j].begin.val;\r
-                                       low = champ[j] - r / 8.0 < itvl[j].begin.val ? itvl[j].begin.val : champ[j] - r / 8.0;\r
-                                       high = champ[j] + r / 8.0 > itvl[j].end.val ? itvl[j].end.val : champ[j] + r / 8.0;\r
+                                       r = itvl[j].end.value - itvl[j].begin.value;\r
+                                       low = champ[j] - r / 8.0 < itvl[j].begin.value ? itvl[j].begin.value : champ[j] - r / 8.0;\r
+                                       high = champ[j] + r / 8.0 > itvl[j].end.value ? itvl[j].end.value : champ[j] + r / 8.0;\r
                                        itvl[j] = new Interval(low, high);\r
                                }\r
 \r
index 20cbfa3..42e7668 100644 (file)
@@ -299,7 +299,7 @@ namespace Psychlops
                                var val = new System.Windows.Controls.TextBox { Width = 100 };\r
                                System.Windows.Controls.Canvas.SetLeft(val, 100);\r
                                var slide = new System.Windows.Controls.Slider {\r
-                                               Minimum = ss.range.begin.val, Maximum = ss.range.end.val,\r
+                                               Minimum = ss.range.begin.value, Maximum = ss.range.end.value,\r
                                                Name = ss.label,\r
                                                Value = ss.retval,\r
                                                Tag = ss, Width = 200,\r