IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 16, 2020, 1:54:47 PM (6 years ago)
Author:
tdeboer
Message:

revert to working Ohana build

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/rotate.c

    r41269 r41340  
    33int rotate (int argc, char **argv) {
    44 
    5   int i, j, NX, NY;
     5  int i, j, NX, NY, X, Y, Lx, Ly, N;
    66  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;
    88  double pc11, pc12, pc21, pc22, PC11, PC12, PC21, PC22;
    99  Buffer *buf;
    1010
    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  }
    2020
    2121  if (argc != 3) {
     
    221221  }
    222222
    223   double angle = atof (argv[2]);
    224   double CosAngle = cos (angle*RAD_DEG);
    225   double SinAngle = sin (angle*RAD_DEG);
     223  angle = atof (argv[2]);
     224  CosAngle = cos (angle*RAD_DEG);
     225  SinAngle = sin (angle*RAD_DEG);
    226226 
    227227  gprint (GP_ERR, "rotating: %f %f %f\n", angle, CosAngle, SinAngle);
    228228
    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);
     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  */
    239239
    240240  /* fix reference pixel */
    241241  gfits_scan (&buf[0].header, "CRPIX1", "%lf", 1, &Xo);
    242242  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;
    245249  gfits_modify (&buf[0].header, "CRPIX1", "%lf", 1, X1);
    246250  gfits_modify (&buf[0].header, "CRPIX2", "%lf", 1, Y1);
     
    251255  gfits_scan (&buf[0].header, "PC002001", "%lf", 1, &pc21);
    252256  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;
    257261  gfits_modify (&buf[0].header, "PC001001", "%le", 1, PC11);
    258262  gfits_modify (&buf[0].header, "PC001002", "%le", 1, PC12);
     
    266270  gfits_create_matrix (&buf[0].header, &buf[0].matrix);
    267271  gfits_print_alt (&buf[0].header, "HISTORY", "%S", 1, "WARNING: rotated image!");
    268 
    269272  out_buff = (float *)buf[0].matrix.buffer;
    270 
    271273  for (j = 0; j < Ly; j++) {
    272274    for (i = 0; i < Lx; i++, out_buff++) {
    273275
    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;
    295289      *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];
    297290    }
    298291  }
Note: See TracChangeset for help on using the changeset viewer.