Changeset 13063 for trunk/psLib/src/math/psEllipse.c
- Timestamp:
- Apr 27, 2007, 12:13:33 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psEllipse.c (modified) (1 diff)
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)
Note:
See TracChangeset
for help on using the changeset viewer.
