IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13839


Ignore:
Timestamp:
Jun 14, 2007, 3:03:22 PM (19 years ago)
Author:
magnier
Message:

adding partially-implemented TNX

Location:
trunk/psLib/src/astro
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/astro/psCoord.c

    r12737 r13839  
    11/** @file  psCoord.c
    2 *
    3 *  @brief Contains basic coordinate transformation definitions and operations
    4 *
    5 *  This file defines the basic types for astronomical coordinate
    6 *  transformation
    7 *
    8 *  @ingroup CoordinateTransform
    9 *
    10 *  @author GLG, MHPCC
    11 *
    12 *  @version $Revision: 1.138 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2007-04-04 21:10:03 $
    14 *
    15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    16 */
     2 *
     3 *  @brief Contains basic coordinate transformation definitions and operations
     4 *
     5 *  This file defines the basic types for astronomical coordinate
     6 *  transformation
     7 *
     8 *  @ingroup CoordinateTransform
     9 *
     10 *  @author GLG, MHPCC
     11 *
     12 *  @version $Revision: 1.139 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2007-06-15 01:03:22 $
     14 *
     15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     16 */
    1717/******************************************************************************/
    1818/*  INCLUDE FILES                                                             */
     
    7272XXX: below is the code using the standard matrix representation.  note that
    7373this inversion requires x->nX == 1, y->nY == 1 and x->nY <= 1, y->nX <= 1
    74  *****************************************************************************/
     74*****************************************************************************/
    7575psPlaneTransform *p_psPlaneTransformLinearInvert(psPlaneTransform *transform)
    7676{
     
    7979    PS_ASSERT_PTR_NON_NULL(transform->y, NULL);
    8080    if ((transform->x->nX < 1) ||
    81             (transform->x->nY < 1) ||
    82             (transform->y->nX < 1) ||
    83             (transform->y->nY < 1)) {
     81        (transform->x->nY < 1) ||
     82        (transform->y->nX < 1) ||
     83        (transform->y->nY < 1)) {
    8484        psLogMsg(__func__, PS_LOG_WARN, "WARNING: input transform is not invertible.");
    8585        return(NULL);
     
    150150
    151151Why isn't this called p_psIsPlaneTransformLinear()?
    152  *****************************************************************************/
     152*****************************************************************************/
    153153bool p_psIsProjectionLinear(psPlaneTransform *transform)
    154154{
     
    161161            if (transform->x->coeff[i][j] != 0.0) {
    162162                if (!(((i == 0) && (j == 0)) ||
    163                         ((i == 0) && (j == 1)) ||
    164                         ((i == 1) && (j == 0)))) {
     163                      ((i == 0) && (j == 1)) ||
     164                      ((i == 1) && (j == 0)))) {
    165165                    return(false);
    166166                }
     
    173173            if (transform->y->coeff[i][j] != 0.0) {
    174174                if (!(((i == 0) && (j == 0)) ||
    175                         ((i == 0) && (j == 1)) ||
    176                         ((i == 1) && (j == 0)))) {
     175                      ((i == 0) && (j == 1)) ||
     176                      ((i == 1) && (j == 0)))) {
    177177                    return(false);
    178178                }
     
    304304This transformation takes into account parameters beyond an objects spatial
    305305coordinates: term3 and term4 (magnitude and color).
    306  *****************************************************************************/
     306*****************************************************************************/
    307307psPlane* psPlaneDistortApply(
    308308    psPlane* out,
     
    379379    psProjectionClass class = PS_PROJECTION_CLASS_NONE;
    380380    switch (projection->type) {
    381     case PS_PROJ_LIN:
    382     case PS_PROJ_PLY:
    383     case PS_PROJ_WRP:
     381      case PS_PROJ_LIN:
     382      case PS_PROJ_PLY:
     383      case PS_PROJ_WRP:
    384384        class = PS_PROJECTION_CLASS_CARTESIAN;
    385385        break;
    386     case PS_PROJ_TAN:
    387     case PS_PROJ_DIS:
    388     case PS_PROJ_SIN:
    389     case PS_PROJ_STG:
    390     case PS_PROJ_ZEA:
    391     case PS_PROJ_ZPL:
     386      case PS_PROJ_TAN:
     387      case PS_PROJ_TNX:
     388      case PS_PROJ_DIS:
     389      case PS_PROJ_SIN:
     390      case PS_PROJ_STG:
     391      case PS_PROJ_ZEA:
     392      case PS_PROJ_ZPL:
    392393        class = PS_PROJECTION_CLASS_ZENITHAL;
    393394        break;
    394     case PS_PROJ_AIT:
    395     case PS_PROJ_PAR:
    396     case PS_PROJ_GLS:
    397     case PS_PROJ_MER:
    398     case PS_PROJ_CAR:
     395      case PS_PROJ_AIT:
     396      case PS_PROJ_PAR:
     397      case PS_PROJ_GLS:
     398      case PS_PROJ_MER:
     399      case PS_PROJ_CAR:
    399400        class = PS_PROJECTION_CLASS_PSEUDOCYL;
    400401        break;
    401402
    402     default:
     403      default:
    403404        psAbort("invalid projection");
    404405        break;
     
    414415
    415416    switch (class) {
    416     case PS_PROJECTION_CLASS_CARTESIAN:
     417      case PS_PROJECTION_CLASS_CARTESIAN:
    417418        out->x = (coord->r - projection->R);
    418419        out->y = (coord->d - projection->D);
    419420        break;
    420421
    421     case PS_PROJECTION_CLASS_ZENITHAL:
     422      case PS_PROJECTION_CLASS_ZENITHAL:
    422423        sinDp = sin(projection->D);
    423424        cosDp = cos(projection->D);
     
    427428        cosDelta = cos(coord->d);
    428429
    429         # if ELIXIR_CODE
     430# if ELIXIR_CODE
    430431
    431432        sinTheta =  cosDelta*cosAlpha*cosDp + sinDelta*sinDp;
    432     sinPhiCT =  cosDelta*sinAlpha;
    433     cosPhiCT =  cosDelta*cosAlpha*sinDp - sinDelta*cosDp;
    434     # else
     433        sinPhiCT =  cosDelta*sinAlpha;
     434        cosPhiCT =  cosDelta*cosAlpha*sinDp - sinDelta*cosDp;
     435# else
    435436
    436437        sinTheta =  cosDelta*cosAlpha*cosDp + sinDelta*sinDp;
    437     sinPhiCT = -cosDelta*sinAlpha;
    438     cosPhiCT = -cosDelta*cosAlpha*sinDp + sinDelta*cosDp;
    439     # endif
    440     // Perform the specified projection
    441     switch (projection->type)
    442         {
    443         case PS_PROJ_TAN:
    444         case PS_PROJ_DIS:
    445             // Gnomonic projection
    446             out->x = +sinPhiCT / sinTheta;
    447             out->y = -cosPhiCT / sinTheta;
    448             break;
    449         case PS_PROJ_SIN:
    450             // Othrographic projection
    451             out->x = +sinPhiCT;
    452             out->y = -cosPhiCT;
    453             break;
    454         case PS_PROJ_STG:
    455             // Othrographic projection
    456             out->x = +2*sinPhiCT / (1 + sinTheta);
    457             out->y = -2*cosPhiCT / (1 + sinTheta);
    458             break;
    459         case PS_PROJ_ZEA:
    460         case PS_PROJ_ZPL:
    461             // Zenithal Equal-Area
    462             zeta = M_SQRT2 / sqrt (1 + sinTheta);
    463             out->x = +zeta * sinPhiCT;
    464             out->y = -zeta * cosPhiCT;
    465             break;
    466         default:
    467             psAbort("invalid projection");
    468             break;
    469         }
    470         break;
    471 
    472     case PS_PROJECTION_CLASS_PSEUDOCYL:
     438        sinPhiCT = -cosDelta*sinAlpha;
     439        cosPhiCT = -cosDelta*cosAlpha*sinDp + sinDelta*cosDp;
     440# endif
     441        // Perform the specified projection
     442        switch (projection->type) {
     443          case PS_PROJ_TAN:
     444          case PS_PROJ_TNX: // XXX this is not quite right
     445          case PS_PROJ_DIS:
     446            // Gnomonic projection
     447            out->x = +sinPhiCT / sinTheta;
     448            out->y = -cosPhiCT / sinTheta;
     449            break;
     450          case PS_PROJ_SIN:
     451            // Othrographic projection
     452            out->x = +sinPhiCT;
     453            out->y = -cosPhiCT;
     454            break;
     455          case PS_PROJ_STG:
     456            // Othrographic projection
     457            out->x = +2*sinPhiCT / (1 + sinTheta);
     458            out->y = -2*cosPhiCT / (1 + sinTheta);
     459            break;
     460          case PS_PROJ_ZEA:
     461          case PS_PROJ_ZPL:
     462            // Zenithal Equal-Area
     463            zeta = M_SQRT2 / sqrt (1 + sinTheta);
     464            out->x = +zeta * sinPhiCT;
     465            out->y = -zeta * cosPhiCT;
     466            break;
     467          default:
     468            psAbort("invalid projection");
     469            break;
     470        }
     471        break;
     472
     473      case PS_PROJECTION_CLASS_PSEUDOCYL:
    473474        phi = coord->r - projection->R;
    474475        theta = coord->d - projection->D;
    475476        switch (projection->type)
    476477        {
    477         case PS_PROJ_AIT:
     478          case PS_PROJ_AIT:
    478479            // Hammer-Aitoff projection
    479480            zeta = 1.0/sqrt(0.5*(1.0+cos(theta)*cos(phi/2.0)));
     
    481482            out->y = zeta*sin(theta);
    482483            break;
    483         case PS_PROJ_GLS:
     484          case PS_PROJ_GLS:
    484485            // projection name?
    485486            out->x = phi * cos(theta);
    486487            out->x = theta;
    487488            break;
    488         case PS_PROJ_PAR:
     489          case PS_PROJ_PAR:
    489490            // Parabolic projection
    490491            out->x = phi*(2.0*cos(2.0*theta/3.0) - 1.0);
    491492            out->y = M_PI*sin(theta/3.0);
    492493            break;
    493         case PS_PROJ_CAR:
    494         case PS_PROJ_MER:
     494          case PS_PROJ_CAR:
     495          case PS_PROJ_MER:
    495496            psAbort("projection not yet implemented");
    496497            break;
    497         default:
     498          default:
    498499            psAbort("invalid projection");
    499500            break;
     
    501502        break;
    502503
    503     default:
     504      default:
    504505        psAbort("invalid projection");
    505506        break;
     
    535536    psProjectionClass class = PS_PROJECTION_CLASS_NONE;
    536537    switch (projection->type) {
    537     case PS_PROJ_LIN:
    538     case PS_PROJ_PLY:
    539     case PS_PROJ_WRP:
     538      case PS_PROJ_LIN:
     539      case PS_PROJ_PLY:
     540      case PS_PROJ_WRP:
    540541        class = PS_PROJECTION_CLASS_CARTESIAN;
    541542        break;
    542     case PS_PROJ_TAN:
    543     case PS_PROJ_DIS:
    544     case PS_PROJ_SIN:
    545     case PS_PROJ_STG:
    546     case PS_PROJ_ZEA:
    547     case PS_PROJ_ZPL:
     543      case PS_PROJ_TAN:
     544      case PS_PROJ_TNX:
     545      case PS_PROJ_DIS:
     546      case PS_PROJ_SIN:
     547      case PS_PROJ_STG:
     548      case PS_PROJ_ZEA:
     549      case PS_PROJ_ZPL:
    548550        class = PS_PROJECTION_CLASS_ZENITHAL;
    549551        break;
    550     case PS_PROJ_AIT:
    551     case PS_PROJ_PAR:
    552     case PS_PROJ_GLS:
    553     case PS_PROJ_CAR:
    554     case PS_PROJ_MER:
     552      case PS_PROJ_AIT:
     553      case PS_PROJ_PAR:
     554      case PS_PROJ_GLS:
     555      case PS_PROJ_CAR:
     556      case PS_PROJ_MER:
    555557        class = PS_PROJECTION_CLASS_PSEUDOCYL;
    556558        break;
    557559
    558     default:
     560      default:
    559561        psAbort("invalid projection");
    560562        break;
     
    575577    // Perform inverse projection
    576578    switch (class) {
    577     case PS_PROJECTION_CLASS_CARTESIAN:
     579      case PS_PROJECTION_CLASS_CARTESIAN:
    578580        out->r = coord->x*projection->Xs + projection->R;
    579581        out->d = coord->y*projection->Ys + projection->D;
    580582        break;
    581583
    582     case PS_PROJECTION_CLASS_ZENITHAL:
     584      case PS_PROJECTION_CLASS_ZENITHAL:
    583585        // Remove plate scales
    584586        x = coord->x*projection->Xs;
     
    588590        cosPhi   = (R == 0) ? 1.0 : -y / R;
    589591
    590         switch (projection->type)
    591         {
    592         case PS_PROJ_TAN:
    593         case PS_PROJ_DIS:
     592        switch (projection->type) {
     593          case PS_PROJ_TAN:
     594          case PS_PROJ_TNX:// XXX this is not quite right
     595          case PS_PROJ_DIS:
    594596            // Gnonomic deprojection
    595597            rho      = sqrt (1 + R*R);
     
    597599            cosTheta = R / rho;
    598600            break;
    599         case PS_PROJ_SIN:
     601          case PS_PROJ_SIN:
    600602            // Orhtographic deprojection
    601603            sinTheta = sqrt (1 - R*R);
    602604            cosTheta = R;
    603605            break;
    604         case PS_PROJ_STG:
     606          case PS_PROJ_STG:
    605607            psAbort("STG not defined");
    606608            break;
    607         case PS_PROJ_ZEA:
    608         case PS_PROJ_ZPL:
     609          case PS_PROJ_ZEA:
     610          case PS_PROJ_ZPL:
    609611            if (R > 2)
    610612                return NULL;
     
    612614            cosTheta = sqrt (1 - PS_SQR(sinTheta));
    613615            break;
    614         default:
     616          default:
    615617            psAbort("invalid projection");
    616618            break;
     
    622624        // Convert from projection spherical coordinates
    623625        // psLib versions:
    624         # if ELIXIR_CODE
     626# if ELIXIR_CODE
    625627        // XXX the elixir version : does the ADD have a sign error?
    626628        psF64 delta    = asin(sinTheta*sinDp - cosTheta*cosPhi*cosDp);
    627629        psF64 sinAlpha = +cosTheta*sinPhi;
    628630        psF64 cosAlpha = +cosTheta*cosPhi*sinDp + sinTheta*cosDp;
    629         # else
    630 
    631             psF64 delta    = asin(sinTheta*sinDp + cosTheta*cosPhi*cosDp);
     631# else
     632
     633        psF64 delta    = asin(sinTheta*sinDp + cosTheta*cosPhi*cosDp);
    632634        psF64 sinAlpha = -cosTheta*sinPhi;
    633635        psF64 cosAlpha = -cosTheta*cosPhi*sinDp + sinTheta*cosDp;
    634         # endif
     636# endif
    635637
    636638        out->d = delta;
     
    638640        break;
    639641
    640     case PS_PROJECTION_CLASS_PSEUDOCYL:
     642      case PS_PROJECTION_CLASS_PSEUDOCYL:
    641643        switch (projection->type)
    642644        {
    643         case PS_PROJ_AIT:
     645          case PS_PROJ_AIT:
    644646            // Hammer-Aitoff deprojection
    645647            // XXX EAM : need range check on z^2 : must be > 0
     
    652654            theta = asin(y*rho);
    653655            break;
    654         case PS_PROJ_PAR:
     656          case PS_PROJ_PAR:
    655657            // Parabolic deprojection
    656658            rho = y/M_PI;
     
    658660            theta = 3.0*asin(rho);
    659661            break;
    660         case PS_PROJ_GLS:
     662          case PS_PROJ_GLS:
    661663            phi = x/cos(y);
    662664            theta = y;
    663665            break;
    664         default:
     666          default:
    665667            psAbort("invalid projection");
    666668            break;
     
    669671        out->d = theta + projection->D;
    670672        break;
    671     default:
     673      default:
    672674        psAbort("invalid projection");
    673675        break;
     
    682684multiplies them.  Basically, for each non-zero coeff in the trans1 coeff[][]
    683685array, you must multiply by all non-zero coeffs in trans2.
    684  *****************************************************************************/
     686*****************************************************************************/
    685687static psPolynomial2D *multiplyDPoly2D(
    686688    psPolynomial2D *trans1,
     
    713715/*****************************************************************************
    714716psPlaneTransformCombine(out, trans1, trans2)
    715  *****************************************************************************/
     717*****************************************************************************/
    716718psPlaneTransform *psPlaneTransformCombine(
    717719    psPlaneTransform *out,
     
    757759    } else {
    758760        if ((out->x->nX == orderX) &&
    759                 (out->x->nY == orderY) &&
    760                 (out->y->nX == orderX) &&
    761                 (out->y->nY == orderY)) {
     761            (out->x->nY == orderY) &&
     762            (out->y->nX == orderX) &&
     763            (out->y->nY == orderY)) {
    762764            myPT = out;
    763765            //
     
    885887XXX: This code ignores nRejIter and sigmaClip.  We must call the ClipFit
    886888routines instead.
    887  *****************************************************************************/
     889*****************************************************************************/
    888890bool psPlaneTransformFit(
    889891    psPlaneTransform *trans,
     
    932934psPlaneTransformInvert(out, in, region, nSamples)
    933935
    934  *****************************************************************************/
     936*****************************************************************************/
    935937psPlaneTransform *psPlaneTransformInvert(
    936938    psPlaneTransform *out,
     
    972974    } else {
    973975        if ((out->x->nX == order) && (out->x->nY == order) &&
    974                 (out->y->nX == order) && (out->y->nX == order)) {
     976            (out->y->nX == order) && (out->y->nX == order)) {
    975977            myPT = out;
    976978        } else {
     
    10301032    const psPlaneTransform *transformation,
    10311033    const psPlane *coord
    1032 )
     1034    )
    10331035{
    10341036    PS_ASSERT_PTR_NON_NULL(transformation, NULL);
     
    11211123        fxnVal = psPlaneTransformApply(fxnVal, inToOut, coord);
    11221124        if (fabs(fxnVal->x - coord->x) <= fabs(deriv->x) &&
    1123                 fabs(fxnVal->y - coord->y) <= fabs(deriv->y)) {
     1125            fabs(fxnVal->y - coord->y) <= fabs(deriv->y)) {
    11241126            int x = (int)(ceil(fabs(deriv->x)));
    11251127            int y = (int)(ceil(fabs(deriv->y)));
     
    12051207
    12061208    switch (type) {
    1207     case PS_PROJ_LIN:
     1209      case PS_PROJ_LIN:
    12081210        psStringAppend (&name, "%s-LIN", prefix);
    12091211        return name;
    1210     case PS_PROJ_PLY:
     1212      case PS_PROJ_PLY:
    12111213        psStringAppend (&name, "%s-PLY", prefix);
    12121214        return name;
    1213     case PS_PROJ_WRP:
     1215      case PS_PROJ_WRP:
    12141216        psStringAppend (&name, "%s-WRP", prefix);
    12151217        return name;
    1216     case PS_PROJ_TAN:
     1218      case PS_PROJ_TAN:
    12171219        psStringAppend (&name, "%s-TAN", prefix);
    12181220        return name;
    1219     case PS_PROJ_DIS:
     1221      case PS_PROJ_TNX:
     1222        psStringAppend (&name, "%s-TNX", prefix);
     1223        return name;
     1224      case PS_PROJ_DIS:
    12201225        psStringAppend (&name, "%s-DIS", prefix);
    12211226        return name;
    1222     case PS_PROJ_SIN:
     1227      case PS_PROJ_SIN:
    12231228        psStringAppend (&name, "%s-SIN", prefix);
    12241229        return name;
    1225     case PS_PROJ_STG:
     1230      case PS_PROJ_STG:
    12261231        psStringAppend (&name, "%s-STG", prefix);
    12271232        return name;
    1228     case PS_PROJ_AIT:
     1233      case PS_PROJ_AIT:
    12291234        psStringAppend (&name, "%s-AIT", prefix);
    12301235        return name;
    1231     case PS_PROJ_PAR:
     1236      case PS_PROJ_PAR:
    12321237        psStringAppend (&name, "%s-PAR", prefix);
    12331238        return name;
    1234     case PS_PROJ_GLS:
     1239      case PS_PROJ_GLS:
    12351240        psStringAppend (&name, "%s-GLS", prefix);
    12361241        return name;
    1237     case PS_PROJ_CAR:
     1242      case PS_PROJ_CAR:
    12381243        psStringAppend (&name, "%s-CAR", prefix);
    12391244        return name;
    1240     case PS_PROJ_MER:
     1245      case PS_PROJ_MER:
    12411246        psStringAppend (&name, "%s-MER", prefix);
    12421247        return name;
    12431248
    1244     default:
     1249      default:
    12451250        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unknown projection type: %d\n", type);
    12461251        return NULL;
     
    12571262    if (!strcmp (&name[4], "-WRP")) return PS_PROJ_WRP;
    12581263    if (!strcmp (&name[4], "-TAN")) return PS_PROJ_TAN;
     1264    if (!strcmp (&name[4], "-TNX")) return PS_PROJ_TNX;
    12591265    if (!strcmp (&name[4], "-DIS")) return PS_PROJ_DIS;
    12601266    if (!strcmp (&name[4], "-SIN")) return PS_PROJ_SIN;
  • trunk/psLib/src/astro/psCoord.h

    r12737 r13839  
    88 *  @author GLG, MHPCC
    99 *
    10  *  @version $Revision: 1.59 $ $Name: not supported by cvs2svn $
    11  *  @date $Date: 2007-04-04 21:10:03 $
     10 *  @version $Revision: 1.60 $ $Name: not supported by cvs2svn $
     11 *  @date $Date: 2007-06-15 01:03:22 $
    1212 *
    1313 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    127127    PS_PROJ_SIN,                        ///< Sine projection
    128128    PS_PROJ_STG,                        ///< Sine projection
     129    PS_PROJ_TNX,                        ///< Sine projection
    129130    PS_PROJ_ZEA,                        ///< Sine projection
    130131    PS_PROJ_ZPL,                        ///< Sine projection
Note: See TracChangeset for help on using the changeset viewer.