Index: /trunk/psLib/src/math/psEllipse.c
===================================================================
--- /trunk/psLib/src/math/psEllipse.c	(revision 13062)
+++ /trunk/psLib/src/math/psEllipse.c	(revision 13063)
@@ -7,4 +7,73 @@
 #include "psConstants.h"
 #include "psEllipse.h"
+
+// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
+psEllipsePol psEllipseAxesToPol(psEllipseAxes axes)
+{
+    psEllipsePol pol;
+
+    pol.e0 = PS_SQR(axes.major) + PS_SQR(axes.minor);
+    double ds = PS_SQR(axes.major) - PS_SQR(axes.minor);
+
+    pol.e1 = ds*cos(2*axes.theta);
+    pol.e2 = ds*sin(2*axes.theta);
+
+    assert (isfinite(pol.e0));
+    assert (isfinite(pol.e1));
+    assert (isfinite(pol.e2));
+
+    return pol;
+}
+
+// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
+psEllipsePol psEllipseShapeToPol(psEllipseShape shape)
+{
+    psEllipsePol pol;
+
+    double r = 1.0 / (1.0 - PS_SQR(shape.sx)*PS_SQR(shape.sy)*PS_SQR(shape.sxy));
+
+    pol.e0 = r*(PS_SQR(shape.sx) + PS_SQR(shape.sy));
+    pol.e1 = r*(PS_SQR(shape.sx) - PS_SQR(shape.sy));
+    pol.e2 = r*(2.0*PS_SQR(shape.sx)*PS_SQR(shape.sy)*shape.sxy);
+
+    assert (isfinite(pol.e0));
+    assert (isfinite(pol.e1));
+    assert (isfinite(pol.e2));
+
+    return pol;
+}
+
+// ellipse rotation (major, minor, theta) -> (x2, y2, xy)
+psEllipseAxes psEllipsePolToAxes(psEllipsePol pol, float minMinorAxis)
+{
+    psEllipseAxes axes;
+
+    axes.theta = +0.5 * atan2 (pol.e2, pol.e1); // theta in radians
+
+    double cs = cos(2*axes.theta);
+    double sn = sin(2*axes.theta);
+    double ds = 0;
+
+    if ((cs > 0.707) || (cs < -0.707)) {
+	ds = pol.e1 / cs;
+    } else {
+	ds = pol.e2 / sn;
+    }
+
+    float LIMIT = PS_SQR(minMinorAxis);
+    if (2.0*(pol.e0 - ds) < LIMIT) {
+	axes.major = sqrt(pol.e0 - LIMIT);
+	axes.minor = sqrt(LIMIT);
+    } else {
+	axes.major = sqrt(0.5*(pol.e0 + ds));
+	axes.minor = sqrt(0.5*(pol.e0 - ds));
+    }
+
+    assert (isfinite(axes.major));
+    assert (isfinite(axes.minor));
+    assert (isfinite(axes.theta));
+
+    return axes;
+}
 
 // ellipse rotation (major, minor, theta) -> (x2, y2, xy)
Index: /trunk/psLib/src/math/psEllipse.h
===================================================================
--- /trunk/psLib/src/math/psEllipse.h	(revision 13062)
+++ /trunk/psLib/src/math/psEllipse.h	(revision 13063)
@@ -2,6 +2,6 @@
  * @brief functions to manipulate sparse matrices equations
  *
- * $Revision: 1.3 $ $Name: not supported by cvs2svn $
- * $Date: 2007-01-23 22:47:23 $
+ * $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ * $Date: 2007-04-27 22:13:33 $
  * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
  */
@@ -21,4 +21,13 @@
 }
 psEllipseAxes;
+
+// strucures to define elliptical shape parameters
+typedef struct
+{
+    double e0;				// Scale (Mxx + Myy)
+    double e1;				// Polarization 1 (Mxx - Myy)
+    double e2;				// Polarization 1 (2Mxy)
+}
+psEllipsePol;
 
 typedef struct
@@ -44,4 +53,8 @@
 psEllipseAxes psEllipseShapeToAxes(psEllipseShape shape, double maxAR);
 
+psEllipsePol psEllipseAxesToPol(psEllipseAxes axes);
+psEllipsePol psEllipseShapeToPol(psEllipseShape shape);
+psEllipseAxes psEllipsePolToAxes(psEllipsePol pol, float minMinorAxis);
+
 /// @}
 #endif
