Changeset 13063
- Timestamp:
- Apr 27, 2007, 12:13:33 PM (19 years ago)
- Location:
- trunk/psLib/src/math
- Files:
-
- 2 edited
-
psEllipse.c (modified) (1 diff)
-
psEllipse.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psEllipse.c
r10999 r13063 7 7 #include "psConstants.h" 8 8 #include "psEllipse.h" 9 10 // ellipse rotation (major, minor, theta) -> (x2, y2, xy) 11 psEllipsePol 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) 29 psEllipsePol 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) 47 psEllipseAxes 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 } 9 78 10 79 // ellipse rotation (major, minor, theta) -> (x2, y2, xy) -
trunk/psLib/src/math/psEllipse.h
r11248 r13063 2 2 * @brief functions to manipulate sparse matrices equations 3 3 * 4 * $Revision: 1. 3$ $Name: not supported by cvs2svn $5 * $Date: 2007-0 1-23 22:47:23 $4 * $Revision: 1.4 $ $Name: not supported by cvs2svn $ 5 * $Date: 2007-04-27 22:13:33 $ 6 6 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 7 7 */ … … 21 21 } 22 22 psEllipseAxes; 23 24 // strucures to define elliptical shape parameters 25 typedef struct 26 { 27 double e0; // Scale (Mxx + Myy) 28 double e1; // Polarization 1 (Mxx - Myy) 29 double e2; // Polarization 1 (2Mxy) 30 } 31 psEllipsePol; 23 32 24 33 typedef struct … … 44 53 psEllipseAxes psEllipseShapeToAxes(psEllipseShape shape, double maxAR); 45 54 55 psEllipsePol psEllipseAxesToPol(psEllipseAxes axes); 56 psEllipsePol psEllipseShapeToPol(psEllipseShape shape); 57 psEllipseAxes psEllipsePolToAxes(psEllipsePol pol, float minMinorAxis); 58 46 59 /// @} 47 60 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
