00001 /*!@file AppMedia/stim-surprise.C generate surprising stimuli */ 00002 00003 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/AppMedia/stim-elnaz.C $ 00004 // $Id: stim-elnaz.C 12962 2010-03-06 02:13:53Z irock $ 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 // arrays of precessing dots and one is special in there? 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 // int speed=2; // pixel per frame 00053 Point2D<int> foe= Point2D<int>(0 , 0); 00054 // get random centers: 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 // check if they have gone out 00078 if(direction>0) //foe 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 //center[n].i=ii; 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 //center[n].j=jj; 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) //foc 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 //center[n].i=ii; 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 //center[n].j=jj; 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; //thetac -= DTHETA; // += 3.67 * DTHETA; 00124 count++; 00125 if(count>DOT_LIFE_TIME) 00126 count=0; 00127 } 00128 } 00129 // random noise? 00130 00131 // arrays of precessing dots and one is special in there? 00132 else if (strcmp(argv[1], "dots") == 0) 00133 { 00134 // get random centers: 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 //if (n == 27) { rx = 0; ry = 0; if ((k/6) & 1) col = 0; } 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; //thetac -= DTHETA; // += 3.67 * DTHETA; 00163 } 00164 } 00165 // random noise? 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 // random blinking? 00184 else if (strcmp(argv[1], "blink") == 0) 00185 { 00186 // get random centers: 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 /* So things look consistent in everyone's emacs... */ 00225 /* Local Variables: */ 00226 /* indent-tabs-mode: nil */ 00227 /* End: */