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 #define DOT_RAD 4
00022 #define DOT_SPEED_PIXEL_PER_FRAME 2
00023
00024 #define DEATH_RATE_PERCENT 0
00025
00026 #define DOT_LIFE_TIME 200
00027
00028 int main(const int argc, const char **argv)
00029 {
00030 initRandomNumbers();
00031 Image<byte> img(WIDTH, WIDTH, NO_INIT);
00032
00033 if (argc < 2) LFATAL("USAGE: stim_surprise <type>");
00034
00035
00036
00037 if (strcmp(argv[1], "foe") == 0 || strcmp(argv[1], "foc") == 0)
00038 {
00039
00040 img.clear(128);
00041
00042 Raster::WriteRGB(img, "greyframe.ppm");
00043
00044 int direction=0;
00045 if (strcmp(argv[1], "foe") == 0){
00046 direction=1;
00047 }
00048 if (strcmp(argv[1], "foc") == 0){
00049 direction=-1;
00050 }
00051
00052
00053 Point2D<int> foe= Point2D<int>(0 , 0);
00054
00055 std::vector<Point2D<int> > center;
00056 std::vector<Point2D<int> > temp;
00057 std::vector<double> phi;
00058 for (int j = DX/2; j < WIDTH; j += DX)
00059 for (int i = DX/2; i < WIDTH; i += DX)
00060 {
00061 center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)), j + int(5.0 * (randomDouble()-0.5))));
00062 phi.push_back(M_PI * randomDouble());
00063 }
00064
00065 double theta = 0.0;
00066
00067 int count=0;
00068 for (int k = 0; k < NFRAME; k ++)
00069 {
00070 img.clear(128 );
00071
00072 for (unsigned int n = 0; n < center.size(); n ++)
00073 {
00074
00075 byte col_in_white = 255;
00076 byte col_out_black = 0;
00077
00078 if(direction>0)
00079 {
00080 int ii = int(center[n].i + direction*(center[n].i-foe.i)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00081 if(ii > WIDTH || ii< 0){
00082 ii = int(center[n].i + direction*(center[n].i-foe.i)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00083 }
00084
00085 int jj = int(center[n].j + direction*(center[n].j-foe.j)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00086 if(jj > WIDTH || jj< 0){
00087 jj = int(center[n].j + direction*(center[n].j-foe.j)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00088 }
00089
00090
00091 temp.push_back(Point2D<int>(ii, jj));
00092
00093 drawDisk(img, Point2D<int>(ii, jj), DOT_RAD*2, col_out_black);
00094 drawDisk(img, Point2D<int>(ii, jj), DOT_RAD, col_in_white);
00095
00096
00097 }
00098
00099 if(direction<0)
00100 {
00101 int ii = int(center[n].i + direction*(center[n].i-foe.i)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00102 if(ii > WIDTH || ii< 0){
00103 ii = int(center[n].i + direction*(center[n].i-foe.i)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00104 }
00105
00106 int jj = int(center[n].j + direction*(center[n].j-foe.j)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00107 if(jj > WIDTH || jj< 0){
00108 jj = int(center[n].j + direction*(center[n].j-foe.j)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00109 }
00110
00111
00112 drawDisk(img, Point2D<int>(ii, jj), DOT_RAD*2, col_out_black);
00113 drawDisk(img, Point2D<int>(ii, jj), DOT_RAD, col_in_white);
00114
00115
00116 }
00117
00118 }
00119
00120
00121
00122 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00123 theta += DOT_SPEED_PIXEL_PER_FRAME;
00124 count++;
00125 if(count>DOT_LIFE_TIME)
00126 count=0;
00127 }
00128 }
00129
00130
00131
00132 else if (strcmp(argv[1], "dots") == 0)
00133 {
00134
00135 std::vector<Point2D<int> > center; std::vector<double> phi;
00136 for (int j = DX/2; j < WIDTH; j += DX)
00137 for (int i = DX/2; i < WIDTH; i += DX)
00138 {
00139 center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00140 j + int(5.0 * (randomDouble()-0.5))));
00141 phi.push_back(M_PI * randomDouble());
00142 }
00143
00144 double theta = 0.0, thetac = 0.0;;
00145 for (int k = 0; k < NFRAME; k ++)
00146 {
00147 img.clear();
00148
00149 for (unsigned int n = 0; n < center.size(); n ++)
00150 {
00151 double t = theta, rx = RAD, ry = RAD, p = phi[n];
00152 byte col = 255;
00153 if (n == 27) t = thetac;
00154
00155
00156 int ii = int(center[n].i + rx * cos(t + p));
00157 int jj = int(center[n].j + ry * sin(t + p));
00158 drawDisk(img, Point2D<int>(ii, jj), 4, col);
00159 }
00160
00161 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00162 theta += DTHETA;
00163 }
00164 }
00165
00166 else if (strcmp(argv[1], "rnd") == 0)
00167 {
00168 for (int k = 0; k < NFRAME; k ++)
00169 {
00170 for (int j = 0; j < WIDTH; j ++)
00171 for (int i = 0; i < WIDTH; i ++)
00172 {
00173
00174 double d2 = (i-127)*(i-127) + (j-127)*(j-127);
00175 double coeff = exp(-d2 / 400.0) * 0.5;
00176
00177 img.setVal(i, j, 128 + int(256.0 * (1.0-coeff) * randomDouble()) -
00178 int(128.0 * (1.0-coeff)));
00179 }
00180 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00181 }
00182 }
00183
00184 else if (strcmp(argv[1], "blink") == 0)
00185 {
00186
00187 std::vector<Point2D<int> > center; std::vector<int> phi;
00188 const int period = 20;
00189 for (int j = DX/2; j < WIDTH; j += DX)
00190 for (int i = DX/2; i < WIDTH; i += DX)
00191 {
00192 center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00193 j + int(5.0 * (randomDouble()-0.5))));
00194 phi.push_back(randomUpToNotIncluding(period));
00195 }
00196
00197 for (int k = 0; k < NFRAME; k ++)
00198 {
00199 img.clear();
00200
00201 for (unsigned int n = 0; n < center.size(); n ++)
00202 {
00203 byte col;
00204 if (n == 27)
00205 {
00206 if (((k + phi[n]) & 4) < 2) col = 255; else col = 0;
00207 }
00208 else
00209 {
00210 if (((k + phi[n]) % period) < period/2) col = 255;
00211 else col = 0;
00212 }
00213 drawDisk(img, center[n], 4, col);
00214 }
00215
00216 Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00217
00218 }
00219 }
00220 return 0;
00221 }
00222
00223
00224
00225
00226
00227