OSDN Git Service

hk
[psychlops/silverlight.git] / dev3 / psychlops / extention / standard / figures.cs
index 6d512f6..dd26370 100644 (file)
@@ -1,52 +1,49 @@
-namespace Psychlops\r
+\r
+using System.Windows.Media.Imaging;\r
+namespace Psychlops\r
 {\r
 \r
     public static class Figures\r
     {\r
-        /*\r
-           public static void drawGrating(out Image img, int width , int height, double frequency, double contrast, double orientation, double phase)\r
-           {\r
-                   if(img.width != width || img.height != height) img = new Image(width, height);\r
-                   double xp, yp, r, freq = frequency*2*PI;\r
-                   for(int y=0; y<height; y++) {\r
-                           yp = y-height/2.0;\r
-                           for(int x=0; x<width; x++) {\r
-                                   xp = x-width/2.0;\r
-                                   r = sqrt(xp*xp+yp*yp);\r
-                                   img.pix_raw(x,y,\r
-                                     Color(\r
-                                           0.5+0.5 * contrast* cos(freq* (sin(orientation)*xp-cos(orientation)*yp) + phase)\r
-                                     )\r
-                                   );\r
-                           }\r
-                   }\r
-           }\r
 \r
-        public static void drawGaussian(out Image img, double sigma, double factor)\r
+               public static void drawGrating(double wavelength, double contrast, double orientation, double phase)\r
+               {\r
+                       double freq = 2 * Math.PI / wavelength;\r
+                       Canvas.default_buffer.ForEach(\r
+                               (x, y) => new Color(.5 + .5 * Math.sin(phase + (Math.sin(orientation) * x - Math.cos(orientation) * y) * freq))\r
+                       );\r
+               }\r
+\r
+               public static void drawGrating(ref Image img, int width, int height, double wavelength, double contrast, double orientation, double phase)\r
            {\r
-            const int width = (int)(sigma * 8), height = (int)(sigma * 8);\r
-            if (img.width != width || img.height != height) img = new Image(width, height);\r
-            double xp, yp, r, r2;\r
-                   for(int y=0; y<height; y++) {\r
-                           yp = y-height/2.0;\r
-                           for(int x=0; x<width; x++) {\r
-                                   xp = x-width/2.0;\r
-                                   r = sqrt(xp*xp+yp*yp);\r
-                                   r2 = -(r*r) / (2.0*sigma*sigma);\r
-                                   img.pix_raw(x,y,Color(factor*(exp(r2))));\r
-                           }\r
-                   }\r
+                       double width_half = width / 2.0, height_half = height / 2.0;\r
+            if (img==null || img.width != width || img.height != height)\r
+                img = new Image(width, height);\r
+            double freq = 2 * Math.PI / wavelength;\r
+                       img.field(\r
+                               (x, y) => new Color(.5 +.5 * Math.sin(phase + (Math.sin(orientation)*x-Math.cos(orientation)*y) * freq))\r
+                       );\r
            }\r
-         * */\r
+               public static void drawGaussian(ref Image img, double sigma, double factor)\r
+               {\r
+                       int width = (int)(sigma * 8), height = (int)(sigma * 8);\r
+                       double width_half = width / 2.0, height_half = height / 2.0;\r
+                       if (img == null || img.width != width || img.height != height)\r
+                               img = new Image(width, height);\r
+                       img.field(\r
+                               (x, y) => new Color(factor * Math.gaussian(Math.radius(x - width_half, y - height_half), width / 8.0))\r
+                       );\r
+               }\r
 \r
-        public static void drawGabor(out Image img, double sigma, double wavelength, double contrast, double orientation, double phase)\r
+               public static void drawGabor(ref Image img, double sigma, double wavelength, double contrast, double orientation, double phase)\r
            {\r
             int width = (int)(sigma * 8), height = (int)(sigma * 8);\r
-            //if (img.width != width || img.height != height)\r
+                       double width_half = width / 2.0, height_half = height / 2.0;\r
+            if (img==null || img.width != width || img.height != height)\r
                 img = new Image(width, height);\r
             double freq = 2 * Math.PI / wavelength;\r
                        img.field(\r
-                (x, y) => new Color(.5 + Math.gaussian(Math.radius(x - width, y - height), width / 8.0) * .5 * Math.sin(phase + x * freq))\r
+                               (x, y) => new Color(.5 + Math.gaussian(Math.radius(x - width_half, y - height_half), width / 8.0) * .5 * Math.sin(phase + (Math.sin(orientation)*x-Math.cos(orientation)*y) * freq))\r
                        );\r
            }\r
 \r