stim-surprise.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "Image/Image.H"
00007 #include "Image/DrawOps.H"
00008 #include "Image/ShapeOps.H"
00009 #include "Util/MathFunctions.H"
00010 #include "Image/Pixels.H"
00011 #include "Raster/Raster.H"
00012
00013 #include <vector>
00014
00015 #define WIDTH 256
00016 #define NFRAME 300
00017 #define DX 32
00018 #define DTHETA 0.1
00019 #define RAD 8
00020
00021 int main(const int argc, const char **argv)
00022 {
00023 initRandomNumbers();
00024 Image<byte> img(WIDTH, WIDTH, NO_INIT);
00025
00026 if (argc < 2) LFATAL("USAGE: stim_surprise <type>");
00027
00028
00029 if (strcmp(argv[1], "dots") == 0)
00030 {
00031
00032 std::vector<Point2D<int> > center; std::vector<double> phi;
00033 for (int j = DX/2; j < WIDTH; j += DX)
00034 for (int i = DX/2; i < WIDTH; i += DX)
00035 {
00036 center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00037 j + int(5.0 * (randomDouble()-0.5))));
00038 phi.push_back(M_PI * randomDouble());
00039 }
00040
00041 double theta = 0.0, thetac = 0.0;;
00042 for (int k = 0; k < NFRAME; k ++)
00043 {
00044 img.clear();
00045
00046 for (unsigned int n = 0; n < center.size(); n ++)
00047 {
00048 double t = theta, rx = RAD, ry = RAD, p = phi[n];
00049 byte col = 255;
00050 if (n == 27) t = thetac;
00051
00052
00053 int ii = int(center[n].i + rx * cos(t + p));
00054 int jj = int(center[n].j + ry * sin(t + p));
00055 drawDisk(img, Point2D<int>(ii, jj), 4, col);
00056 }
00057
00058 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00059 theta += DTHETA;
00060 }
00061 }
00062
00063 else if (strcmp(argv[1], "rnd") == 0)
00064 {
00065 for (int k = 0; k < NFRAME; k ++)
00066 {
00067 for (int j = 0; j < WIDTH; j ++)
00068 for (int i = 0; i < WIDTH; i ++)
00069 {
00070
00071 double d2 = (i-127)*(i-127) + (j-127)*(j-127);
00072 double coeff = exp(-d2 / 400.0) * 0.5;
00073
00074 img.setVal(i, j, 128 + int(256.0 * (1.0-coeff) * randomDouble()) -
00075 int(128.0 * (1.0-coeff)));
00076 }
00077 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00078 }
00079 }
00080
00081 else if (strcmp(argv[1], "blink") == 0)
00082 {
00083
00084 std::vector<Point2D<int> > center; std::vector<int> phi;
00085 const int period = 20;
00086 for (int j = DX/2; j < WIDTH; j += DX)
00087 for (int i = DX/2; i < WIDTH; i += DX)
00088 {
00089 center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00090 j + int(5.0 * (randomDouble()-0.5))));
00091 phi.push_back(randomUpToNotIncluding(period));
00092 }
00093
00094 for (int k = 0; k < NFRAME; k ++)
00095 {
00096 img.clear();
00097
00098 for (unsigned int n = 0; n < center.size(); n ++)
00099 {
00100 byte col;
00101 if (n == 27)
00102 {
00103 if (((k + phi[n]) & 4) < 2) col = 255; else col = 0;
00104 }
00105 else
00106 {
00107 if (((k + phi[n]) % period) < period/2) col = 255;
00108 else col = 0;
00109 }
00110 drawDisk(img, center[n], 4, col);
00111 }
00112
00113 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00114
00115 }
00116 }
00117 return 0;
00118 }
00119
00120
00121
00122
00123
00124