-// point3d.hxx -- a 3d point class.
-//
-// Adapted from algebra3 by Jean-Francois Doue, started October 1998.
-//
-// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu
+/**
+ * \file point3d.hxx
+ * A 3d point class (depricated). This class is depricated and we are
+ * in the process of removing all usage of it in favor of plib's "sg"
+ * library of point, vector, and math routines. Plib's sg lib is less
+ * object oriented, but integrates more seamlessly with opengl.
+ *
+ * Adapted from algebra3 by Jean-Francois Doue, started October 1998.
+ */
+
+// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
-// You should have received a copy of the GNU Library General Public
-// License along with this library; if not, write to the
-// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#define _POINT3D_HXX
-#ifndef __cplusplus
+#ifndef __cplusplus
# error This library requires C++
-#endif
+#endif
#include <simgear/compiler.h>
-#ifdef FG_MATH_EXCEPTION_CLASH
+#ifdef SG_MATH_EXCEPTION_CLASH
# define exception c_exception
#endif
-#ifdef FG_HAVE_STD_INCLUDES
+#ifdef SG_HAVE_STD_INCLUDES
# include <iostream>
# include <cassert>
# include <cmath>
# include <math.h>
#endif
+#include "SGMath.hxx"
+
// I don't understand ... <math.h> or <cmath> should be included
-// already depending on how you defined FG_HAVE_STD_INCLUDES, but I
+// already depending on how you defined SG_HAVE_STD_INCLUDES, but I
// can go ahead and add this -- CLO
#ifdef __MWERKS__
-FG_USING_NAMESPACE(std);
+SG_USING_NAMESPACE(std);
#endif
-#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
-FG_USING_STD(ostream);
-FG_USING_STD(istream);
-#endif
+SG_USING_STD(ostream);
+SG_USING_STD(istream);
const double fgPoint3_Epsilon = 0.0000001;
bool operator== (const Point3D& a, const Point3D& b); // p1 == p2?
-///////////////////////////
-//
-// 3D Point
-//
-///////////////////////////
+/**
+ * 3D Point class.
+ */
class Point3D {
public:
- // Constructors
-
+ /** Default constructor */
Point3D();
Point3D(const double x, const double y, const double z);
explicit Point3D(const double d);
Point3D(const Point3D &p);
+ static Point3D fromSGGeod(const SGGeod& geod);
+ static Point3D fromSGGeoc(const SGGeoc& geoc);
+ static Point3D fromSGVec3(const SGVec3<double>& cart);
+ static Point3D fromSGVec3(const SGVec3<float>& cart);
+ static Point3D fromSGVec2(const SGVec2<double>& cart);
+
// Assignment operators
Point3D& operator = ( const Point3D& p ); // assignment of a Point3D
void setx(const double x);
void sety(const double y);
void setz(const double z);
+ void setlon(const double x);
+ void setlat(const double y);
+ void setradius(const double z);
+ void setelev(const double z);
// Queries
double radius() const; // polar radius
double elev() const; // geodetic elevation (if specifying a surface point)
+ SGGeod toSGGeod(void) const;
+ SGGeoc toSGGeoc(void) const;
+
+ SGVec3d toSGVec3d(void) const;
+ SGVec3f toSGVec3f(void) const;
+ SGVec2f toSGVec2f(void) const;
+
// friends
friend Point3D operator - (const Point3D& p); // -p1
friend bool operator == (const Point3D& a, const Point3D& b); // p1 == p2?
// CONSTRUCTORS
-inline Point3D::Point3D() {}
+inline Point3D::Point3D()
+{
+ n[PX] = n[PY] = 0.0;
+ n[PZ] = -9999.0;
+}
inline Point3D::Point3D(const double x, const double y, const double z)
{
n[PX] = p.n[PX]; n[PY] = p.n[PY]; n[PZ] = p.n[PZ];
}
+inline Point3D Point3D::fromSGGeod(const SGGeod& geod)
+{
+ Point3D pt;
+ pt.setlon(geod.getLongitudeRad());
+ pt.setlat(geod.getLatitudeRad());
+ pt.setelev(geod.getElevationM());
+ return pt;
+}
+
+inline Point3D Point3D::fromSGGeoc(const SGGeoc& geoc)
+{
+ Point3D pt;
+ pt.setlon(geoc.getLongitudeRad());
+ pt.setlat(geoc.getLatitudeRad());
+ pt.setradius(geoc.getRadiusM());
+ return pt;
+}
+
+inline Point3D Point3D::fromSGVec3(const SGVec3<double>& cart)
+{
+ Point3D pt;
+ pt.setx(cart.x());
+ pt.sety(cart.y());
+ pt.setz(cart.z());
+ return pt;
+}
+
+inline Point3D Point3D::fromSGVec3(const SGVec3<float>& cart)
+{
+ Point3D pt;
+ pt.setx(cart.x());
+ pt.sety(cart.y());
+ pt.setz(cart.z());
+ return pt;
+}
+
+inline Point3D Point3D::fromSGVec2(const SGVec2<double>& cart)
+{
+ Point3D pt;
+ pt.setx(cart.x());
+ pt.sety(cart.y());
+ pt.setz(0);
+ return pt;
+}
+
// ASSIGNMENT OPERATORS
inline Point3D& Point3D::operator = (const Point3D& p)
n[PZ] = z;
}
+inline void Point3D::setlon(const double x) {
+ n[PX] = x;
+}
+
+inline void Point3D::setlat(const double y) {
+ n[PY] = y;
+}
+
+inline void Point3D::setradius(const double z) {
+ n[PZ] = z;
+}
+
+inline void Point3D::setelev(const double z) {
+ n[PZ] = z;
+}
+
// QUERIES
inline double& Point3D::operator [] ( int i)
inline double Point3D::elev() const { return n[PZ]; }
+inline SGGeod Point3D::toSGGeod(void) const
+{
+ SGGeod geod;
+ geod.setLongitudeRad(lon());
+ geod.setLatitudeRad(lat());
+ geod.setElevationM(elev());
+ return geod;
+}
+
+inline SGGeoc Point3D::toSGGeoc(void) const
+{
+ SGGeoc geoc;
+ geoc.setLongitudeRad(lon());
+ geoc.setLatitudeRad(lat());
+ geoc.setRadiusM(radius());
+ return geoc;
+}
+
+inline SGVec3d Point3D::toSGVec3d(void) const
+{
+ return SGVec3d(x(), y(), z());
+}
+
+inline SGVec3f Point3D::toSGVec3f(void) const
+{
+ return SGVec3f(x(), y(), z());
+}
+
+inline SGVec2f Point3D::toSGVec2f(void) const
+{
+ return SGVec2f(x(), y());
+}
// FRIENDS