MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 /* ***************************************************************** 00002 MESQUITE -- The Mesh Quality Improvement Toolkit 00003 00004 Copyright 2008 Sandia National Laboratories. Developed at the 00005 University of Wisconsin--Madison under SNL contract number 00006 624796. The U.S. Government and the University of Wisconsin 00007 retain certain rights to this software. 00008 00009 This library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Lesser General Public 00011 License as published by the Free Software Foundation; either 00012 version 2.1 of the License, or (at your option) any later version. 00013 00014 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 (lgpl.txt) along with this library; if not, write to the Free Software 00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 00023 (2008) [email protected] 00024 00025 ***************************************************************** */ 00026 00027 /** \file MsqGeomPrim.hpp 00028 * \brief Classes for primitive geometry 00029 * \author Jason Kraftcheck 00030 */ 00031 00032 #ifndef MSQ_MSQ_GEOM_PRIM_HPP 00033 #define MSQ_MSQ_GEOM_PRIM_HPP 00034 00035 #include "Mesquite.hpp" 00036 #include "Vector3D.hpp" 00037 00038 namespace MBMesquite 00039 { 00040 00041 /**\brief Line in R^3 */ 00042 class MESQUITE_EXPORT MsqLine 00043 { 00044 private: 00045 Vector3D mPoint; 00046 Vector3D mDirection; // unit direction 00047 00048 public: 00049 MsqLine( const Vector3D& p_point, const Vector3D& p_dir ) : mPoint( p_point ), mDirection( p_dir / p_dir.length() ) 00050 { 00051 } 00052 00053 MsqLine() : mPoint( 0, 0, 0 ), mDirection( 0, 0, 0 ) {} 00054 00055 static MsqLine two_point( const Vector3D& p1, const Vector3D& p2 ) 00056 { 00057 return MsqLine( p1, p2 - p1 ); 00058 } 00059 00060 const Vector3D& point() const 00061 { 00062 return mPoint; 00063 } 00064 const Vector3D& direction() const 00065 { 00066 return mDirection; 00067 } 00068 00069 //! Get point given parameter (mPoint + param * mDirection) 00070 Vector3D point( double param ) const 00071 { 00072 return point() + param * direction(); 00073 } 00074 00075 //! Get parameter value for location on line closest to input point. 00076 double closest( const Vector3D& from_point ) const 00077 { 00078 return mDirection % ( from_point - mPoint ); 00079 } 00080 00081 double distance( const Vector3D& from_point ) const 00082 { 00083 return ( point( closest( from_point ) ) - from_point ).length(); 00084 } 00085 00086 //! Find intersection between two lines 00087 //!\return false if no point intersection (skew, parallel, coincident, etc.) 00088 bool intersect( const MsqLine& other, double& param, double epsilon ) const; 00089 00090 //! Find parameter of closest position on this line to another line 00091 bool closest( const MsqLine& other, double& param ) const; 00092 }; 00093 00094 /**\brief Circle in R^3 */ 00095 class MESQUITE_EXPORT MsqCircle 00096 { 00097 private: 00098 Vector3D mCenter; 00099 Vector3D mNormal; //!< unit normal 00100 double mRadius; 00101 00102 public: 00103 MsqCircle() : mCenter( 0, 0, 0 ), mNormal( 0, 0, 0 ), mRadius( 0 ) {} 00104 00105 MsqCircle( const Vector3D& p_center, const Vector3D& p_normal, double p_radius ) 00106 : mCenter( p_center ), mNormal( p_normal / p_normal.length() ), mRadius( p_radius ) 00107 { 00108 } 00109 00110 //! Find circle passing through three points 00111 //!\return false if points are colinear, true otherwise. 00112 static bool three_point( const Vector3D& p1, const Vector3D& p2, const Vector3D& p3, MsqCircle& result ); 00113 00114 //! Find circle with center and two points 00115 //!\return false if points are colinear or not equidistant from center, true otherwise. 00116 static bool two_point( const Vector3D& center, const Vector3D& p1, const Vector3D& p2, MsqCircle& result ); 00117 00118 const Vector3D& center() const 00119 { 00120 return mCenter; 00121 } 00122 const Vector3D& normal() const 00123 { 00124 return mNormal; 00125 } 00126 double radius() const 00127 { 00128 return mRadius; 00129 } 00130 00131 //! Get arbitrary radial vector (vector in plane with length equal to radius) 00132 Vector3D radial_vector() const; 00133 00134 //! Find closest point on circle to input position. Returns 00135 //! arbitrary location on circle if point is at center. 00136 Vector3D closest( const Vector3D& point ) const; 00137 00138 //! Find closest point on circle to input position, and tangent 00139 //! at that point. Fails and returns false if point is at center 00140 //! of circle. 00141 bool closest( const Vector3D& point, Vector3D& point_on_circle, Vector3D& tangent_at_point ) const; 00142 }; 00143 00144 /**\brief Plane */ 00145 class MESQUITE_EXPORT MsqPlane 00146 { 00147 private: 00148 Vector3D mNormal; //!< unit normal 00149 double mCoeff; 00150 00151 public: 00152 MsqPlane( const Vector3D& p_normal, double coeff ); 00153 MsqPlane( const Vector3D& p_normal, const Vector3D& p_point ); 00154 //! ax+by+cz+d=0 00155 MsqPlane( double a, double b, double c, double d ); 00156 00157 //! get unit normal vector for plane 00158 const Vector3D& normal() const 00159 { 00160 return mNormal; 00161 } 00162 00163 //! get coefficient term for plane 00164 double coefficient() const 00165 { 00166 return mCoeff; 00167 } 00168 00169 //! Get point on plane closest to origin. 00170 Vector3D point() const 00171 { 00172 return -mCoeff * mNormal; 00173 } 00174 00175 //! Get distance from point to plane 00176 double distance( const Vector3D& p_point ) const 00177 { 00178 return fabs( normal() % p_point + coefficient() ); 00179 } 00180 00181 //! Get closest location on plane to input position 00182 Vector3D closest( const Vector3D& p_point ) const 00183 { 00184 return p_point - normal() * ( normal() % p_point + coefficient() ); 00185 } 00186 00187 //! Find intersection of this plane with another. 00188 //!\return false if parallel or invalid plane, true otherwise 00189 bool intersect( const MsqPlane& plane, MsqLine& result ) const; 00190 00191 //! Find point of itersection with a line 00192 //!\return false if parallel, true otherwise 00193 bool intersect( const MsqLine& line, double& line_param ) const; 00194 }; 00195 00196 /**\brief Sphere */ 00197 class MESQUITE_EXPORT MsqSphere 00198 { 00199 private: 00200 Vector3D mCenter; 00201 double mRadius; 00202 00203 public: 00204 MsqSphere( const Vector3D& p_center, double p_radius ) : mCenter( p_center ), mRadius( p_radius ) {} 00205 00206 const Vector3D& center() const 00207 { 00208 return mCenter; 00209 } 00210 double radius() const 00211 { 00212 return mRadius; 00213 } 00214 00215 //! Get location on sphere closest to input location. 00216 //! Returns arbitrary point if input location is at center. 00217 Vector3D closest( const Vector3D& point ) const; 00218 00219 //! Get location on sphere closest to input location, and 00220 //! normal at closest point. 00221 //!\return false if input point is at center, true otherwise. 00222 bool closest( const Vector3D& point, Vector3D& point_on_sphere, Vector3D& normal_at_point ) const; 00223 00224 double distance( const Vector3D& point ) const 00225 { 00226 return fabs( ( center() - point ).length() - radius() ); 00227 } 00228 00229 //! Intersect plane with sphere 00230 //!\return true if intersection exists, false otherwise. 00231 bool intersect( const MsqPlane& plane, MsqCircle& result ) const; 00232 00233 //! Intersect spheres 00234 //!\return true if intersection exists, false otherwise. 00235 bool intersect( const MsqSphere& sphere, MsqCircle& result ) const; 00236 }; 00237 00238 } // namespace MBMesquite 00239 00240 #endif