IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 20, 2007, 1:53:48 PM (19 years ago)
Author:
eugene
Message:

adding utility functions for coordinate system conversions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageBinning.c

    r12699 r14923  
    88 *  @author Eugene Magnier, IfA
    99 *
    10  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    11  *  @date $Date: 2007-03-31 02:59:41 $
     10 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     11 *  @date $Date: 2007-09-20 23:53:46 $
    1212 *
    1313 *  Copyright 2007 Institute for Astronomy, University of Hawaii
     
    4444    assert (binning->nYbin > 0);
    4545
     46    // force nXruff*nXbin > nXfine
    4647    binning->nXruff = binning->nXfine / binning->nXbin;
    4748    if (binning->nXfine % binning->nXbin) binning->nXruff ++;
    4849
     50    // force nYruff*nYbin > nYfine
    4951    binning->nYruff = binning->nYfine / binning->nYbin;
    5052    if (binning->nYfine % binning->nYbin) binning->nYruff ++;
     
    5658        break;
    5759      case PS_IMAGE_BINNING_CENTER:
    58         binning->nXoff = ((binning->nXruff * binning->nXbin) % binning->nXfine) / 2;
    59         binning->nYoff = ((binning->nYruff * binning->nYbin) % binning->nYfine) / 2;
     60        binning->nXoff = (binning->nXruff * binning->nXbin - binning->nXfine) / 2;
     61        binning->nYoff = (binning->nYruff * binning->nYbin - binning->nYfine) / 2;
    6062        break;
    6163      case PS_IMAGE_BINNING_RIGHT:
    62         binning->nXoff = ((binning->nXruff * binning->nXbin) % binning->nXfine);
    63         binning->nYoff = ((binning->nYruff * binning->nYbin) % binning->nYfine);
     64        binning->nXoff = (binning->nXruff * binning->nXbin - binning->nXfine);
     65        binning->nYoff = (binning->nYruff * binning->nYbin - binning->nYfine);
    6466        break;
    6567      default:
     
    7880void psImageBinningSetSkip(psImageBinning *binning, psImage *image) {
    7981
    80     binning->nXskip = image->col0 - binning->nXoff;
    81     binning->nYskip = image->row0 - binning->nYoff;
     82    if (image != NULL) {
     83        binning->nXskip = image->col0 - binning->nXoff;
     84        binning->nYskip = image->row0 - binning->nYoff;
     85    } else {
     86        binning->nXskip = 0 - binning->nXoff;
     87        binning->nYskip = 0 - binning->nYoff;
     88    }
    8289    return;
    8390}
     
    9097    assert (binning->nYruff > 0);
    9198
     99    // force nXruff*nXbin > nXfine
    92100    binning->nXbin = binning->nXfine / binning->nXruff;
    93101    if (binning->nXfine % binning->nXruff) binning->nXbin ++;
    94102
     103    // force nYruff*nYbin > nYfine
    95104    binning->nYbin = binning->nYfine / binning->nYruff;
    96105    if (binning->nYfine % binning->nYruff) binning->nYbin ++;
     
    102111        break;
    103112      case PS_IMAGE_BINNING_CENTER:
    104         binning->nXoff = (binning->nXfine % binning->nXbin) / 2;
    105         binning->nYoff = (binning->nYfine % binning->nYbin) / 2;
     113        binning->nXoff = (binning->nXruff * binning->nXbin - binning->nXfine) / 2;
     114        binning->nYoff = (binning->nYruff * binning->nYbin - binning->nYfine) / 2;
    106115        break;
    107116      case PS_IMAGE_BINNING_RIGHT:
    108         binning->nXoff = (binning->nXfine % binning->nXbin);
    109         binning->nYoff = (binning->nYfine % binning->nYbin);
     117        binning->nXoff = (binning->nXruff * binning->nXbin - binning->nXfine);
     118        binning->nYoff = (binning->nYruff * binning->nYbin - binning->nYfine);
    110119        break;
    111120      default:
     
    137146}
    138147
    139 /*** pmFPACopy.c:binRegion had the following logic ***/
    140 # if (0)
    141     // Want to include the lower bound: 1 binned by 4 --> 0; 3 binned by 4 --> 0; 4 binned by 4 --> 1
    142     region->x0 = (int)(region->x0 / xBin);
    143     region->y0 = (int)(region->y0 / yBin);
    144     // Want to exclude the upper bound: 4 binned by 4 --> 1; 5 binned by 4 --> 2; 7 binned by 4 --> 2
    145     region->x1 = (int)((region->x1 + xBin - 1) / xBin);
    146     region->y1 = (int)((region->y1 + yBin - 1) / yBin);
    147 # endif
    148148
    149 /*
    150  * dvoMakeCorrUnbin ** OK
    151  * psphotImageMedian ** OK?
    152  * psphotMagnitudes ** OK
    153  * pmFPACopy ** OK
    154  * pmConceptsUpdate ** OK
    155  * pmFPAMosaic ** OK (needs more use of psImageBinning functions)
    156  * psImageUnbin
    157  * psImageRebin
    158  * ppImageRebinReadout
    159  */
     149// convert the fine coordinate to the ruff coordinate
     150double psImageBinningGetRuffX (const psImageBinning *binning, const double xFine) {
    160151
     152    PS_ASSERT_INT_POSITIVE(binning->nXbin, NAN);
     153    PS_ASSERT_INT_POSITIVE(binning->nYbin, NAN);
     154    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nXskip, binning->nXbin, NAN);
     155    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nYskip, binning->nYbin, NAN);
     156
     157    double xRuff = (xFine - binning->nXskip)/binning->nXbin;
     158    return xRuff;
     159}
     160double psImageBinningGetRuffY (const psImageBinning *binning, const double yFine) {
     161
     162    PS_ASSERT_INT_POSITIVE(binning->nXbin, NAN);
     163    PS_ASSERT_INT_POSITIVE(binning->nYbin, NAN);
     164    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nXskip, binning->nXbin, NAN);
     165    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nYskip, binning->nYbin, NAN);
     166
     167    double yRuff = (yFine - binning->nYskip)/binning->nYbin;
     168    return yRuff;
     169}
     170
     171// convert the ruff coordinate to the fine coordinate
     172double psImageBinningGetFineX (const psImageBinning *binning, const double xRuff) {
     173
     174    PS_ASSERT_INT_POSITIVE(binning->nXbin, NAN);
     175    PS_ASSERT_INT_POSITIVE(binning->nYbin, NAN);
     176    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nXskip, binning->nXbin, NAN);
     177    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nYskip, binning->nYbin, NAN);
     178
     179    double xFine = xRuff * binning->nXbin + binning->nXskip;
     180    return xFine;
     181}
     182double psImageBinningGetFineY (const psImageBinning *binning, const double yRuff) {
     183
     184    PS_ASSERT_INT_POSITIVE(binning->nXbin, NAN);
     185    PS_ASSERT_INT_POSITIVE(binning->nYbin, NAN);
     186    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nXskip, binning->nXbin, NAN);
     187    PS_ASSERT_INT_LESS_THAN_OR_EQUAL(binning->nYskip, binning->nYbin, NAN);
     188
     189    double yFine = yRuff * binning->nYbin + binning->nYskip;
     190    return yFine;
     191}
Note: See TracChangeset for help on using the changeset viewer.