IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13063


Ignore:
Timestamp:
Apr 27, 2007, 12:13:33 PM (19 years ago)
Author:
magnier
Message:

adding polarization terms

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

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/math/psEllipse.c

    r10999 r13063  
    77#include "psConstants.h"
    88#include "psEllipse.h"
     9
     10// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
     11psEllipsePol psEllipseAxesToPol(psEllipseAxes axes)
     12{
     13    psEllipsePol pol;
     14
     15    pol.e0 = PS_SQR(axes.major) + PS_SQR(axes.minor);
     16    double ds = PS_SQR(axes.major) - PS_SQR(axes.minor);
     17
     18    pol.e1 = ds*cos(2*axes.theta);
     19    pol.e2 = ds*sin(2*axes.theta);
     20
     21    assert (isfinite(pol.e0));
     22    assert (isfinite(pol.e1));
     23    assert (isfinite(pol.e2));
     24
     25    return pol;
     26}
     27
     28// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
     29psEllipsePol psEllipseShapeToPol(psEllipseShape shape)
     30{
     31    psEllipsePol pol;
     32
     33    double r = 1.0 / (1.0 - PS_SQR(shape.sx)*PS_SQR(shape.sy)*PS_SQR(shape.sxy));
     34
     35    pol.e0 = r*(PS_SQR(shape.sx) + PS_SQR(shape.sy));
     36    pol.e1 = r*(PS_SQR(shape.sx) - PS_SQR(shape.sy));
     37    pol.e2 = r*(2.0*PS_SQR(shape.sx)*PS_SQR(shape.sy)*shape.sxy);
     38
     39    assert (isfinite(pol.e0));
     40    assert (isfinite(pol.e1));
     41    assert (isfinite(pol.e2));
     42
     43    return pol;
     44}
     45
     46// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
     47psEllipseAxes psEllipsePolToAxes(psEllipsePol pol, float minMinorAxis)
     48{
     49    psEllipseAxes axes;
     50
     51    axes.theta = +0.5 * atan2 (pol.e2, pol.e1); // theta in radians
     52
     53    double cs = cos(2*axes.theta);
     54    double sn = sin(2*axes.theta);
     55    double ds = 0;
     56
     57    if ((cs > 0.707) || (cs < -0.707)) {
     58        ds = pol.e1 / cs;
     59    } else {
     60        ds = pol.e2 / sn;
     61    }
     62
     63    float LIMIT = PS_SQR(minMinorAxis);
     64    if (2.0*(pol.e0 - ds) < LIMIT) {
     65        axes.major = sqrt(pol.e0 - LIMIT);
     66        axes.minor = sqrt(LIMIT);
     67    } else {
     68        axes.major = sqrt(0.5*(pol.e0 + ds));
     69        axes.minor = sqrt(0.5*(pol.e0 - ds));
     70    }
     71
     72    assert (isfinite(axes.major));
     73    assert (isfinite(axes.minor));
     74    assert (isfinite(axes.theta));
     75
     76    return axes;
     77}
    978
    1079// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
  • trunk/psLib/src/math/psEllipse.h

    r11248 r13063  
    22 * @brief functions to manipulate sparse matrices equations
    33 *
    4  * $Revision: 1.3 $ $Name: not supported by cvs2svn $
    5  * $Date: 2007-01-23 22:47:23 $
     4 * $Revision: 1.4 $ $Name: not supported by cvs2svn $
     5 * $Date: 2007-04-27 22:13:33 $
    66 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    77 */
     
    2121}
    2222psEllipseAxes;
     23
     24// strucures to define elliptical shape parameters
     25typedef struct
     26{
     27    double e0;                          // Scale (Mxx + Myy)
     28    double e1;                          // Polarization 1 (Mxx - Myy)
     29    double e2;                          // Polarization 1 (2Mxy)
     30}
     31psEllipsePol;
    2332
    2433typedef struct
     
    4453psEllipseAxes psEllipseShapeToAxes(psEllipseShape shape, double maxAR);
    4554
     55psEllipsePol psEllipseAxesToPol(psEllipseAxes axes);
     56psEllipsePol psEllipseShapeToPol(psEllipseShape shape);
     57psEllipseAxes psEllipsePolToAxes(psEllipsePol pol, float minMinorAxis);
     58
    4659/// @}
    4760#endif
Note: See TracChangeset for help on using the changeset viewer.