POINT3.H
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 9k
Category:

OpenCV

Development Platform:

Visual C++

  1. /*****************************************************************************
  2.  * VCGLib                                                                    *
  3.  *  *
  4.  * Visual Computing Group                                                o>  *
  5.  * IEI Institute, CNUCE Institute, CNR Pisa                             <|   *
  6.  *                                                                      /   *
  7.  * Copyright(C) 1999 by Paolo Cignoni, Claudio Rocchini                      *
  8.  * All rights reserved.                                                      *
  9.  *  *
  10.  * Permission  to use, copy, modify, distribute  and sell this  software and *
  11.  * its documentation for any purpose is hereby granted without fee, provided *
  12.  * that  the above copyright notice appear  in all copies and that both that *
  13.  * copyright   notice  and  this  permission  notice  appear  in  supporting *
  14.  * documentation. the author makes  no representations about the suitability *
  15.  * of this software for any purpose. It is provided  "as is" without express *
  16.  * or implied warranty.                                                      *
  17.  *                                                          *
  18.  *****************************************************************************/
  19. /****************************************************************************
  20.  History
  21.  1999 Feb 02 First Draft.
  22. Mar 15 First Working release 
  23. Jul 10 Reindented and reformatted
  24.  Fixed != bug
  25.  Fixed Eq bug
  26. ****************************************************************************/
  27. #ifndef __VCGLIB_POINT3
  28. #define __VCGLIB_POINT3
  29. //#include <limits>
  30. #include <assert.h>
  31. #include <vcg/Utility.h>
  32. namespace vcg {
  33. template <class FLTYPE> class Point3
  34. {
  35. public:
  36. FLTYPE v[3];
  37. typedef Point3<FLTYPE> Point3_FT;
  38.   inline FLTYPE &x() {return v[0];} ;
  39.   inline FLTYPE &y() {return v[1];};
  40. inline FLTYPE &z() {return v[2];};
  41.   inline FLTYPE & operator [] ( const int i ){
  42. assert(i>=0 && i<3);
  43. return v[i];
  44. }
  45. inline const FLTYPE & operator [] ( const int i ) const {
  46. assert(i>=0 && i<3);
  47. return v[i];
  48. }
  49.   inline Point3<FLTYPE> ( void ) { }
  50.   inline Point3<FLTYPE> ( const FLTYPE nx, const FLTYPE ny, const FLTYPE nz ){
  51. v[0] = nx; v[1] = ny; v[2] = nz;
  52. }
  53. inline Point3<FLTYPE> ( Point3<FLTYPE> const & p)  {   
  54. v[0]= p.v[0];    v[1]= p.v[1];    v[2]= p.v[2];
  55. }
  56. inline Point3<FLTYPE> & operator =( Point3<FLTYPE> const & p){
  57. v[0]= p.v[0]; v[1]= p.v[1]; v[2]= p.v[2];
  58. return *this;
  59. }
  60.   inline Point3<FLTYPE> operator + ( Point3<FLTYPE> const & p) const { 
  61. return Point3<FLTYPE>( v[0]+p.v[0], v[1]+p.v[1], v[2]+p.v[2] );
  62. }
  63.   inline Point3<FLTYPE> operator - ( Point3<FLTYPE> const & p) const {
  64. return Point3<FLTYPE>( v[0]-p.v[0], v[1]-p.v[1], v[2]-p.v[2] );
  65. }
  66.   inline Point3<FLTYPE> operator * ( const FLTYPE s ) const {
  67. return Point3<FLTYPE>( v[0] * s, v[1] * s, v[2] * s );
  68. }
  69. inline Point3<FLTYPE> operator / ( const FLTYPE s ) const {
  70. return Point3<FLTYPE>( v[0] / s, v[1] / s, v[2] / s );
  71. }
  72.   inline FLTYPE operator * ( Point3<FLTYPE> const & p ) const {
  73. return ( v[0]*p.v[0] + v[1]*p.v[1] + v[2]*p.v[2] );
  74. }  
  75.   inline Point3<FLTYPE> operator ^ ( Point3<FLTYPE> const & p ) const {
  76. return Point3<FLTYPE>(
  77.     v[1]*p.v[2] - v[2]*p.v[1],
  78. v[2]*p.v[0] - v[0]*p.v[2],
  79. v[0]*p.v[1] - v[1]*p.v[0]
  80. );
  81. }  
  82.   inline Point3<FLTYPE> & operator += ( Point3<FLTYPE> const & p){
  83. v[0] += p.v[0];    v[1] += p.v[1];     v[2] += p.v[2];
  84. return *this;
  85. }
  86.   inline Point3<FLTYPE> & operator -= ( Point3<FLTYPE> const & p){
  87. v[0] -= p.v[0];    v[1] -= p.v[1];     v[2] -= p.v[2];
  88. return *this;
  89. }
  90.   inline Point3<FLTYPE> & operator *= ( const FLTYPE s ){
  91. v[0] *= s;    v[1] *= s;    v[2] *= s;
  92. return *this;
  93. }
  94.   inline Point3<FLTYPE> & operator /= ( const FLTYPE s ){
  95. v[0] /= s;    v[1] /= s;    v[2] /= s;
  96. return *this;
  97. }
  98.   inline FLTYPE Norm( void ) const {
  99. return vcg::sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );
  100. }
  101.   inline FLTYPE Norm2( void ) const{
  102. return ( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );
  103. }
  104.   inline Point3<FLTYPE> & Scale( const FLTYPE sx, const FLTYPE sy, const FLTYPE sz );
  105. inline Point3<FLTYPE> & Normalize( void ){
  106. FLTYPE n = vcg::sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
  107. if(n>0.0) { v[0] /= n; v[1] /= n; v[2] /= n;  }
  108. return *this;
  109. }
  110.   inline bool operator == ( Point3<FLTYPE> const & p ) const {
  111. return (v[0]==p.v[0] && v[1]==p.v[1] && v[2]==p.v[2]);
  112.   inline bool operator != ( Point3<FLTYPE> const & p ) const {
  113. return ( (v[0]!=p.v[0]) || (v[1]!=p.v[1]) || (v[2]!=p.v[2]));
  114. }
  115.   inline bool operator <  ( Point3<FLTYPE> const & p ) const {
  116. return (v[2]!=p.v[2])?(v[2]<p.v[2]):
  117. (v[1]!=p.v[1])?(v[1]<p.v[1]):
  118. (v[0]<p.v[0]);
  119. }
  120. inline bool operator >  ( Point3<FLTYPE> const & p ) const {
  121. return (v[2]!=p.v[2])?(v[2]>p.v[2]):
  122. (v[1]!=p.v[1])?(v[1]>p.v[1]):
  123. (v[0]>p.v[0]);
  124. }
  125. inline bool operator <= ( Point3<FLTYPE> const & p ) const {
  126. return (v[2]!=p.v[2])?(v[2]< p.v[2]):
  127. (v[1]!=p.v[1])?(v[1]< p.v[1]):
  128. (v[0]<=p.v[0]);
  129. }
  130. inline bool operator >= ( Point3<FLTYPE> const & p ) const {
  131. return (v[2]!=p.v[2])?(v[2]> p.v[2]):
  132. (v[1]!=p.v[1])?(v[1]> p.v[1]):
  133. (v[0]>=p.v[0]);
  134. }
  135.   inline FLTYPE Distance( Point3<FLTYPE> const & p ) const{
  136. return (*this-p).Norm();
  137. }
  138. inline FLTYPE SquaredDistance( Point3<FLTYPE> const & p ) const {
  139. return (*this-p).Norm2();
  140. }
  141. inline int Hash() const {
  142. FLTYPE vv = v[0]*1234567 + v[1]*2345671 + v[2]*3456712;
  143. int *ip = (int *)&vv;
  144. return *ip;
  145. }
  146. /*
  147. inline bool Eq( Point3<FLTYPE> const & p ) const {
  148.   return (vcg::abs(v[0]-p.v[0]) < std::numeric_limits<float>::epsilon()*4 &&
  149.   vcg::abs(v[1]-p.v[1]) < std::numeric_limits<float>::epsilon()*4 &&
  150.   vcg::abs(v[2]-p.v[2]) < std::numeric_limits<float>::epsilon()*4 );
  151. }   
  152. inline bool NotEq( Point3<FLTYPE> const & p ) const {
  153.   return (vcg::abs(v[0]-p.v[0]) > std::numeric_limits<float>::epsilon()*4 ||
  154.   vcg::abs(v[1]-p.v[1]) > std::numeric_limits<float>::epsilon()*4 ||
  155.   vcg::abs(v[2]-p.v[2]) > std::numeric_limits<float>::epsilon()*4 );
  156. }   
  157. */
  158. }; // end class definition
  159. template <class FLTYPE>
  160. inline FLTYPE Angle( Point3<FLTYPE> const & p1, Point3<FLTYPE> const & p2 ){
  161.     return (FLTYPE) acos( (p1*p2)/(p1.Norm()*p2.Norm()) );
  162. }
  163. template <class FLTYPE>
  164. inline Point3<FLTYPE> operator - ( Point3<FLTYPE> const & p ){
  165.     return Point3<FLTYPE>( -p.v[0], -p.v[1], -p.v[2] );
  166. }
  167. template <class FLTYPE>
  168. inline Point3<FLTYPE> operator * ( const FLTYPE s, Point3<FLTYPE> const & p ){
  169.     return Point3<FLTYPE>( p.v[0] * s, p.v[1] * s, p.v[2] * s );
  170. }
  171. template <class FLTYPE>
  172. inline FLTYPE Norm( Point3<FLTYPE> const & p ){
  173. return vcg::sqrt( p.v[0]*p.v[0] + p.v[1]*p.v[1] + p.v[2]*p.v[2] );
  174. }
  175. template <class FLTYPE>
  176. inline FLTYPE Norm2( Point3<FLTYPE> const & p ){
  177.     return ( p.v[0]*p.v[0] + p.v[1]*p.v[1] + p.v[2]*p.v[2] );
  178. }
  179. template <class FLTYPE>
  180. inline Point3<FLTYPE> & Normalize( Point3<FLTYPE> & p ){
  181. FLTYPE n = vcg::sqrt( p.v[0]*p.v[0] + p.v[1]*p.v[1] + p.v[2]*p.v[2] );
  182.     if(n>0.0) p/=n;
  183.     return p;
  184. }
  185. template <class FLTYPE>
  186. inline FLTYPE Distance( Point3<FLTYPE> const & p1,Point3<FLTYPE> const & p2 ){
  187.     return Norm(p1-p2);
  188. }
  189. template <class FLTYPE>
  190. inline FLTYPE SquaredDistance( Point3<FLTYPE> const & p1,Point3<FLTYPE> const & p2 ){
  191.     return SquaredNorm(p1-p2);
  192. }
  193. template <class FLTYPE>
  194. inline Point3<FLTYPE> & RotateZ( Point3<FLTYPE> & p, FLTYPE _angle){
  195.   FLTYPE c=cos(_angle);
  196. FLTYPE s=sin(_angle);
  197.   FLTYPE cx=c*p.x()-s*p.y();
  198.   p.y()= s*p.x()+c*p.y();
  199. p.x()= cx;
  200. return p;
  201. }
  202. #ifdef __GL_H__
  203. inline void glVertex(Point3<int> const & p)   { glVertex3iv(p.v);};
  204. inline void glVertex(Point3<short> const & p) { glVertex3sv(p.v);};
  205. inline void glVertex(Point3<float> const & p) { glVertex3fv(p.v);};
  206. inline void glVertex(Point3<double> const & p){ glVertex3dv(p.v);};
  207. inline void glNormal(Point3<int> const & p)   { glNormal3iv(p.v);};
  208. inline void glNormal(Point3<short> const & p) { glNormal3sv(p.v);};
  209. inline void glNormal(Point3<float> const & p) { glNormal3fv(p.v);};
  210. inline void glNormal(Point3<double> const & p){ glNormal3dv(p.v);};
  211. inline void glTexCoord(Point3<int> const & p)   { glTexCoord3iv(p.v);};
  212. inline void glTexCoord(Point3<short> const & p) { glTexCoord3sv(p.v);};
  213. inline void glTexCoord(Point3<float> const & p) { glTexCoord3fv(p.v);};
  214. inline void glTexCoord(Point3<double> const & p){ glTexCoord3dv(p.v);};
  215. inline void glTranslate(Point3<float> const & p) { glTranslatef(p.v[0],p.v[1],p.v[2]);};
  216. inline void glTranslate(Point3<double> const & p){ glTranslated(p.v[0],p.v[1],p.v[2]);};
  217. inline void glScale(Point3<float> const & p) { glScalef(p.v[0],p.v[1],p.v[2]);};
  218. inline void glScale(Point3<double> const & p){ glScaled(p.v[0],p.v[1],p.v[2]);};
  219. #endif
  220. typedef Point3<short>  Point3s;
  221. typedef Point3<int>    Point3i;
  222. typedef Point3<float>  Point3f;
  223. typedef Point3<double> Point3d;
  224. } // end namespace
  225. #endif