Changeset 41340 for trunk/Ohana/src/opihi/cmd.data/rotate.c
- Timestamp:
- Apr 16, 2020, 1:54:47 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.data/rotate.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/rotate.c
r41269 r41340 3 3 int rotate (int argc, char **argv) { 4 4 5 int i, j, NX, NY ;5 int i, j, NX, NY, X, Y, Lx, Ly, N; 6 6 float *in_buff, *out_buff, *c; 7 double Xo, Yo, x, y, X1, Y1;7 double angle, CosAngle, SinAngle, Xo, Yo, dX, dY, fx, fy, x, y, X1, Y1; 8 8 double pc11, pc12, pc21, pc22, PC11, PC12, PC21, PC22; 9 9 Buffer *buf; 10 10 11 //Xo = 0;12 //Yo = 0;13 //if ((N = get_argument (argc, argv, "-center"))) {14 //remove_argument (N, &argc, argv);15 //Xo = atof(argv[N]);16 //remove_argument (N, &argc, argv);17 //Yo = atof(argv[N]);18 //remove_argument (N, &argc, argv);19 //}11 Xo = 0; 12 Yo = 0; 13 if ((N = get_argument (argc, argv, "-center"))) { 14 remove_argument (N, &argc, argv); 15 Xo = atof(argv[N]); 16 remove_argument (N, &argc, argv); 17 Yo = atof(argv[N]); 18 remove_argument (N, &argc, argv); 19 } 20 20 21 21 if (argc != 3) { … … 221 221 } 222 222 223 doubleangle = atof (argv[2]);224 doubleCosAngle = cos (angle*RAD_DEG);225 doubleSinAngle = sin (angle*RAD_DEG);223 angle = atof (argv[2]); 224 CosAngle = cos (angle*RAD_DEG); 225 SinAngle = sin (angle*RAD_DEG); 226 226 227 227 gprint (GP_ERR, "rotating: %f %f %f\n", angle, CosAngle, SinAngle); 228 228 229 // we are rotating about the center pixel, (NX/2, NY/2),230 // but we are then putting the result in a new image231 // of size (Lx,Ly).232 233 / / (x,y) = (i - Nx/2),(j - Ny/2)234 // (x',y') = R(theta) (x,y)235 // (I,J) = (x' + Lx/2),(y' + Ly/2)236 237 int Lx = NX*fabs(CosAngle) + NY*fabs(SinAngle);238 int Ly = NX*fabs(SinAngle) + NY*fabs(CosAngle);229 Lx = NX*fabs(CosAngle) + NY*fabs(SinAngle); 230 Ly = NX*fabs(SinAngle) + NY*fabs(CosAngle); 231 dX = MAX(0,NY*SinAngle); 232 dY = MAX(0,-NX*SinAngle); 233 /* 234 gprint (GP_ERR, "%f %f --> ", Xo, Yo); 235 X1 = Xo*CosAngle - Yo*SinAngle + dX; 236 Y1 = Xo*SinAngle + Yo*CosAngle + dY; 237 gprint (GP_ERR, "%f %f\n", X1, Y1); 238 */ 239 239 240 240 /* fix reference pixel */ 241 241 gfits_scan (&buf[0].header, "CRPIX1", "%lf", 1, &Xo); 242 242 gfits_scan (&buf[0].header, "CRPIX2", "%lf", 1, &Yo); 243 X1 = (Xo - NX/2)*CosAngle + (Yo - NY/2)*SinAngle + Lx/2; 244 Y1 = (NX/2 - Xo)*SinAngle + (Yo - NY/2)*CosAngle + Ly/2; 243 /* 244 X1 = (Xo - dX)*CosAngle - (Yo - dY)*SinAngle; 245 Y1 = (dX - Xo)*SinAngle + (Yo - dY)*CosAngle; 246 */ 247 X1 = Xo*CosAngle - Yo*SinAngle + dX; 248 Y1 = Xo*SinAngle + Yo*CosAngle + dY; 245 249 gfits_modify (&buf[0].header, "CRPIX1", "%lf", 1, X1); 246 250 gfits_modify (&buf[0].header, "CRPIX2", "%lf", 1, Y1); … … 251 255 gfits_scan (&buf[0].header, "PC002001", "%lf", 1, &pc21); 252 256 gfits_scan (&buf[0].header, "PC002002", "%lf", 1, &pc22); 253 PC11 = pc11*CosAngle +pc21*SinAngle;254 PC12 = pc12*CosAngle +pc22*SinAngle;255 PC21 = pc21*CosAngle -pc11*SinAngle;256 PC22 = pc22*CosAngle -pc12*SinAngle;257 PC11 = pc11*CosAngle - pc21*SinAngle; 258 PC12 = pc12*CosAngle - pc22*SinAngle; 259 PC21 = pc21*CosAngle + pc11*SinAngle; 260 PC22 = pc22*CosAngle + pc12*SinAngle; 257 261 gfits_modify (&buf[0].header, "PC001001", "%le", 1, PC11); 258 262 gfits_modify (&buf[0].header, "PC001002", "%le", 1, PC12); … … 266 270 gfits_create_matrix (&buf[0].header, &buf[0].matrix); 267 271 gfits_print_alt (&buf[0].header, "HISTORY", "%S", 1, "WARNING: rotated image!"); 268 269 272 out_buff = (float *)buf[0].matrix.buffer; 270 271 273 for (j = 0; j < Ly; j++) { 272 274 for (i = 0; i < Lx; i++, out_buff++) { 273 275 274 float xo = (i - Lx/2); 275 float yo = (j - Ly/2); 276 277 x = xo*CosAngle + yo*SinAngle; 278 y = -xo*SinAngle + yo*CosAngle; 279 280 int I = x + NX/2; 281 int J = y + NY/2; 282 283 if (I < 0) continue; 284 if (I >= NX - 1) continue; 285 if (J < 0) continue; 286 if (J >= NY - 1) continue; 287 288 c = &in_buff[I + NX*J]; 289 290 int X = (int) x; 291 int Y = (int) y; 292 double fx = x - X; 293 double fy = y - Y; 294 276 x = (i - dX)*CosAngle + (j - dY)*SinAngle; 277 y = (dX - i)*SinAngle + (j - dY)*CosAngle; 278 X = (int) x; 279 Y = (int) y; 280 281 if (X < 0) continue; 282 if (X >= NX - 1) continue; 283 if (Y < 0) continue; 284 if (Y >= NY - 1) continue; 285 286 c = &in_buff[X + NX*Y]; 287 fx = x - X; 288 fy = y - Y; 295 289 *out_buff = (c[0]*(1-fx) + c[1]*fx)*(1-fy) + (c[NX+1]*fx + c[NX]*(1-fx))*fy; 296 // *out_buff = c[0];297 290 } 298 291 }
Note:
See TracChangeset
for help on using the changeset viewer.
