OSDN Git Service

5
[psychlops/silverlight.git] / dev5 / psychlops / extension / standard / figures.cs
diff --git a/dev5/psychlops/extension/standard/figures.cs b/dev5/psychlops/extension/standard/figures.cs
new file mode 100644 (file)
index 0000000..948aecc
--- /dev/null
@@ -0,0 +1,43 @@
+\r
+using System.Windows.Media.Imaging;\r
+namespace Psychlops\r
+{\r
+\r
+    public static partial class Figures\r
+    {\r
+\r
+               public static void drawGrating(ref Image img, int width, int height, double wavelength, double contrast, double orientation, double phase)\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 + contrast * .5 * Math.sin(phase + (Math.sin(orientation)*x-Math.cos(orientation)*y) * freq))\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(ref Image img, double sigma, double frequency, double contrast, double orientation, double phase)\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
+            double freq = 2 * Math.PI * frequency;\r
+                       img.field(\r
+                               (x, y) => new Color(.5 + contrast * 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
+    }\r
+}\r