Changeset 41164 for trunk/Ohana/src/opihi/cmd.data/rotate.c
- Timestamp:
- Nov 27, 2019, 11:22:02 AM (7 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
r34088 r41164 3 3 int rotate (int argc, char **argv) { 4 4 5 int i, j, NX, NY , X, Y, Lx, Ly, N;5 int i, j, NX, NY; 6 6 float *in_buff, *out_buff, *c; 7 double angle, CosAngle, SinAngle, Xo, Yo, dX, dY, fx, fy, x, y, X1, Y1;7 double Xo, Yo, 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 angle = atof (argv[2]);224 CosAngle = cos (angle*RAD_DEG);225 SinAngle = sin (angle*RAD_DEG);223 double angle = atof (argv[2]); 224 double CosAngle = cos (angle*RAD_DEG); 225 double SinAngle = sin (angle*RAD_DEG); 226 226 227 227 gprint (GP_ERR, "rotating: %f %f %f\n", angle, CosAngle, SinAngle); 228 228 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 */229 // we are rotating about the center pixel, (NX/2, NY/2), 230 // but we are then putting the result in a new image 231 // 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); 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 /* 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; 243 X1 = (Xo - NX/2)*CosAngle + (Yo - NY/2)*SinAngle + Lx/2; 244 Y1 = (NX/2 - Xo)*SinAngle + (Yo - NY/2)*CosAngle + Ly/2; 249 245 gfits_modify (&buf[0].header, "CRPIX1", "%lf", 1, X1); 250 246 gfits_modify (&buf[0].header, "CRPIX2", "%lf", 1, Y1); … … 255 251 gfits_scan (&buf[0].header, "PC002001", "%lf", 1, &pc21); 256 252 gfits_scan (&buf[0].header, "PC002002", "%lf", 1, &pc22); 257 PC11 = pc11*CosAngle -pc21*SinAngle;258 PC12 = pc12*CosAngle -pc22*SinAngle;259 PC21 = pc21*CosAngle +pc11*SinAngle;260 PC22 = pc22*CosAngle +pc12*SinAngle;253 PC11 = pc11*CosAngle + pc21*SinAngle; 254 PC12 = pc12*CosAngle + pc22*SinAngle; 255 PC21 = pc21*CosAngle - pc11*SinAngle; 256 PC22 = pc22*CosAngle - pc12*SinAngle; 261 257 gfits_modify (&buf[0].header, "PC001001", "%le", 1, PC11); 262 258 gfits_modify (&buf[0].header, "PC001002", "%le", 1, PC12); … … 270 266 gfits_create_matrix (&buf[0].header, &buf[0].matrix); 271 267 gfits_print_alt (&buf[0].header, "HISTORY", "%S", 1, "WARNING: rotated image!"); 268 272 269 out_buff = (float *)buf[0].matrix.buffer; 273 270 for (j = 0; j < Ly; j++) { 274 271 for (i = 0; i < Lx; i++, out_buff++) { 275 272 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; 273 float xo = (i - Lx/2); 274 float yo = (j - Ly/2); 275 276 x = xo*CosAngle + yo*SinAngle; 277 y = -xo*SinAngle + yo*CosAngle; 278 279 int I = x + NX/2; 280 int J = y + NY/2; 281 282 if (I < 0) continue; 283 if (I >= NX - 1) continue; 284 if (J < 0) continue; 285 if (J >= NY - 1) continue; 286 287 c = &in_buff[I + NX*J]; 288 289 int X = (int) x; 290 int Y = (int) y; 291 double fx = x - X; 292 double fy = y - Y; 293 289 294 *out_buff = (c[0]*(1-fx) + c[1]*fx)*(1-fy) + (c[NX+1]*fx + c[NX]*(1-fx))*fy; 295 // *out_buff = c[0]; 290 296 } 291 297 }
Note:
See TracChangeset
for help on using the changeset viewer.
