00001 /*!@file AppMedia/stim-surprise.C generate surprising stimuli */ 00002 00003 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/AppMedia/stim-surprise.C $ 00004 // $Id: stim-surprise.C 9412 2008-03-10 23:10:15Z farhan $ 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 // arrays of precessing dots and one is special in there? 00029 if (strcmp(argv[1], "dots") == 0) 00030 { 00031 // get random centers: 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 //if (n == 27) { rx = 0; ry = 0; if ((k/6) & 1) col = 0; } 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; //thetac -= DTHETA; // += 3.67 * DTHETA; 00060 } 00061 } 00062 // random noise? 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 // random blinking? 00081 else if (strcmp(argv[1], "blink") == 0) 00082 { 00083 // get random centers: 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 /* So things look consistent in everyone's emacs... */ 00122 /* Local Variables: */ 00123 /* indent-tabs-mode: nil */ 00124 /* End: */