OpenVSP API Documentation 3.52.0
Loading...
Searching...
No Matches
Vec3d.h
1//
2// This file is released under the terms of the NASA Open Source Agreement (NOSA)
3// version 1.3 as detailed in the LICENSE file which accompanies this software.
4//
5
6//******************************************************************************
7//
8// 3D Point Double Class
9//
10// J.R. Gloudemans - 7/7/93
11//******************************************************************************
12
13#ifndef VSPVEC3D_H
14#define VSPVEC3D_H
15
16
17
18namespace Eigen
19{
20 template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols >
21 class Matrix;
22}
23
24typedef Eigen::Matrix< double, 1, 3, 0x1, 1, 3 > threed_point_type;
25
26
27#include <iostream>
28#include <vector>
29
30class vec2d;
31
32class vec3d;
33class Matrix4d;
34
35//==== Forward declare to get around MS Compiler bug ====//
71
72vec3d operator+( const vec3d& a, const vec3d& b );
73
109
110vec3d operator-( const vec3d& a, const vec3d& b );
111
148
149vec3d operator*( const vec3d& a, double b );
150
187
188vec3d operator*( const vec3d& a, const vec3d& b );
189
226
227vec3d operator/( const vec3d& a, double b );
228
229
237class vec3d
238{
239private:
240
241
242public:
243 double v[3];
244
245 vec3d(); // vec3d x or new vec3d
246
247 // The copy constructor, copy assignment operator, and destructor are intentionally left implicit.
248 // This keeps vec3d trivially copyable, so vector<vec3d> copies can use the memmove fast path
249 // instead of calling an out-of-line function per element.
250#ifdef SWIG
251 vec3d( const vec3d& a ); // vec3d x = y -- implicit in C++, declared so SWIG wraps it for the bindings.
252#endif
253
254 vec3d( double xx, double yy, double zz );
255
256 vec3d( const threed_point_type &a );
257
258 vec3d( const double a[3] );
259 vec3d( const float a[3] );
260 vec3d( const std::vector<double> &a );
261
262 vec3d& operator=( const vec2d& a );
263 vec3d& operator=( double a ); // x = 35.
264 vec3d& operator=( const threed_point_type &a );
265
266 double& operator [] ( int i )
267 {
268 return v[i];
269 }
270 const double& operator [] ( int i ) const
271 {
272 return v[i];
273 }
274
275 vec2d as_vec2d_xy();
276
277 // Set Point Values
301
302 vec3d& set_xyz( double xx, double yy, double zz );
303
324
325 vec3d& set_vec( const std::vector<double> &a );
336 vec3d& set_arr( const double a[] );
337 vec3d& set_arr( const float a[] );
359
360 vec3d& set_x( double xx );
361
383
384 vec3d& set_y( double yy );
385
407
408 vec3d& set_z( double zz );
409
410
433
434 vec3d& set_refx( const vec3d &a );
457
458 vec3d& set_refy( const vec3d &a );
481
482 vec3d& set_refz( const vec3d &a );
483
484 // Get Point Values
490 void get_pnt( double pnt[3] ) const
491 {
492 pnt[0] = v[0];
493 pnt[1] = v[1];
494 pnt[2] = v[2];
495 }
496 void get_pnt( float pnt[3] ) const
497 {
498 pnt[0] = ( float )v[0];
499 pnt[1] = ( float )v[1];
500 pnt[2] = ( float )v[2];
501 }
502 void get_pnt( threed_point_type &pnt ) const;
503
530
531 double x() const
532
533 {
534 return( v[0] );
535 }
536
562
563 double y() const
564
565 {
566 return( v[1] );
567 }
568
594
595 double z() const
596
597 {
598 return( v[2] );
599 }
600
601 double* data()
602 {
603 return( v );
604 }
605
606 void Transform( const Matrix4d &m );
612 void FlipNormal() {};
613
614 // Rotate About Axis --> Change Internal Values
642
643 void rotate_x( double theta );
644
672
673 void rotate_y( double theta );
674
702
703 void rotate_z( double theta );
704
705 // Scale Up Single Coord --> Change Internal Values
732
733 void scale_x( double scale )
734
735 {
736 v[0] *= scale;
737 };
738
764
765 void scale_y( double scale )
766
767 {
768 v[1] *= scale;
769 };
770
796
797 void scale_z( double scale )
798
799 {
800 v[2] *= scale;
801 };
802
829
830 void offset_x( double offset )
831
832 {
833 v[0] += offset;
834 };
835
861
862 void offset_y( double offset )
863
864 {
865 v[1] += offset;
866 };
867
893
894 void offset_z( double offset )
895
896 {
897 v[2] += offset;
898 };
899
921
922 void offset_i( double offset, int idir )
923 {
924 v[idir] += offset;
925 };
926
954
955 vec3d reflect_xy() const
956
957 {
958 return( vec3d( v[0], v[1], -v[2] ) );
959 }
960
987
988 vec3d reflect_xz() const
989
990 {
991 return( vec3d( v[0], -v[1], v[2] ) );
992 }
993
1020
1021 vec3d reflect_yz() const
1022
1023 {
1024 return( vec3d( -v[0], v[1], v[2] ) );
1025 }
1026
1027 vec3d swap_xy() const
1028 {
1029 return( vec3d( v[1], v[0], v[2] ) );
1030 }
1031 vec3d swap_xz() const
1032 {
1033 return( vec3d( v[2], v[1], v[0] ) );
1034 }
1035 vec3d swap_yz() const
1036 {
1037 return( vec3d( v[0], v[2], v[1] ) );
1038 }
1039
1040 // x = a + b, x = a - b, a*scale, a/scale
1041 friend vec3d operator+( const vec3d& a, const vec3d& b );
1042 friend vec3d operator-( const vec3d& a, const vec3d& b );
1043 friend vec3d operator*( const vec3d& a, double b );
1044 friend vec3d operator*( double b, const vec3d& a );
1045 friend vec3d operator*( const vec3d& a, const vec3d& b );
1046 friend vec3d operator/( const vec3d& a, double b );
1047 vec3d& operator+=( const vec3d& b );
1048 vec3d& operator-=( const vec3d& b );
1049 vec3d& operator*=( double b );
1050 vec3d& operator+=( double b[] );
1051 vec3d& operator-=( double b[] );
1052 vec3d& operator+=( float b[] );
1053 vec3d& operator-=( float b[] );
1054
1055 friend vec3d operator-( const vec3d & in );
1056
1057 friend bool operator==( const vec3d &a, const vec3d& b );
1058 friend bool operator!=( const vec3d &a, const vec3d& b );
1059
1060 // cout << a
1061// friend ostream& operator<< (ostream& out, const vec3d& a);
1062
1063 friend double dist( const vec3d& a, const vec3d& b );
1064 friend double dist_squared( const vec3d& a, const vec3d& b );
1065
1093
1094 double mag() const; // x = a.mag()
1095
1111
1112 double magsq() const;
1113
1147
1148 void normalize(); // a.normalize()
1149
1150
1166
1167 int major_comp() const;
1183
1184 int minor_comp() const;
1185
1201
1202 bool isnan() const;
1218
1219 bool isinf() const;
1235
1236 bool isfinite() const;
1237
1254
1255 void print( const char* label = "" ) const;
1256
1257 friend double dot( const vec3d& a, const vec3d& b ); // x = dot(a,b)
1258 friend vec3d cross( const vec3d& a, const vec3d& b ); // a = cross(b,c)
1259 friend double angle( const vec3d& a, const vec3d& b );
1260 friend double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1261 friend double cos_angle( const vec3d& a, const vec3d& b );
1262 friend double radius_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1263 friend void center_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d& center );
1264 friend bool triangle_plane_intersect_test( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1265 friend double triangle_plane_minimum_dist( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d &pa, vec3d &pb );
1266 friend double triangle_plane_maximum_dist( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d &pa, vec3d &pb );
1267 friend bool plane_plane_intersection( const vec3d &p0, const vec3d &n0, const vec3d &p1, const vec3d &n1, vec3d &p, vec3d &v );
1268 friend double angle_pnt_2_plane( const vec3d& ptplane, vec3d norm, const vec3d& ptaxis, vec3d axis, const vec3d &pt, int ccw, vec3d &prot );
1269 friend void angle_pnt_2_plane( const vec3d& ptplane, vec3d norm, const vec3d& ptaxis, vec3d axis, const vec3d &pt, int ccw, vec3d &prot1, vec3d &prot2, double &theta1, double &theta2 );
1270 friend double signed_dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1271 friend double dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1272 friend double dist_pnt_2_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1273 friend double dist_pnt_2_ray( const vec3d& line_pt1, const vec3d& dir_unit_vec, const vec3d& pnt );
1274// friend double dist_pnt_2_line_seg( vec3d& line_pt1, vec3d& line_pt2, vec3d& pnt);
1275 friend vec3d proj_u_on_v( const vec3d& u, const vec3d& v );
1276 friend vec3d proj_pnt_on_line_seg( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1277 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt );
1278 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt, double &t );
1279 friend vec3d proj_pnt_on_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1280 friend vec3d proj_pnt_to_plane( const vec3d& org, const vec3d& plane_ln1, const vec3d& plane_ln2, const vec3d& pnt );
1281 friend vec3d proj_vec_to_plane( const vec3d& vec, const vec3d& norm );
1282 friend int tri_seg_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1283 double& u, double& w, double& t );
1284 friend int tri_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1285 double& u, double& w, double& t );
1286 friend int plane_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E, double& t );
1287 friend int plane_ray_intersect( const vec3d& orig, const vec3d& norm, const vec3d& D, const vec3d& E, double& t );
1288 friend int ray_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, vec3d& int_pnt1, vec3d& int_pnt2 );
1289 friend double tetra_volume( const vec3d& A, const vec3d& B, const vec3d& C );
1290 friend double area( const vec3d& A, const vec3d& B, const vec3d& C );
1291 friend double poly_area( const std::vector< vec3d > & pnt_vec );
1292 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1 );
1293 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1,
1294 double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1295 friend double nearSegSeg( const vec3d& L0, const vec3d& L1, const vec3d& S0, const vec3d& S1, double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1296 friend double pointLineDistSquared( const vec3d & p, const vec3d& lp0, const vec3d& lp1, double &t, vec3d &pon );
1297 friend double pointSegDistSquared( const vec3d& p, const vec3d& sp0, const vec3d& sp1, double &t, vec3d &pon );
1298 friend vec3d point_on_line( const vec3d & lp0, const vec3d & lp1, const double & t );
1299
1300 friend vec2d MapToPlane( const vec3d & p, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1301 friend vec3d MapFromPlane( const vec2d & uw, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1302
1303 friend int plane_half_space( const vec3d & planeOrig, const vec3d & planeNorm, const vec3d & pnt );
1304
1305 friend bool line_line_intersect( const vec3d & p1, const vec3d & p2, const vec3d & p3, const vec3d & p4, double* s, double* t );
1306
1307 friend vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1308
1309 friend bool PtInTri( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1310 friend vec3d BarycentricWeights( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1311 friend void BilinearWeights( const vec3d & p0, const vec3d & p1, const vec3d & p, std::vector< double > & weights );
1312 friend double tri_tri_min_dist( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & v3, const vec3d & v4, const vec3d & v5, vec3d &p1, vec3d &p2 );
1313 friend double pnt_tri_min_dist( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & pnt, vec3d &pnearest );
1314
1315 friend vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1316 friend void printpt( const vec3d & v );
1317 friend vec3d ToSpherical( const vec3d & v );
1318 friend vec3d ToSpherical2( const vec3d & v, const vec3d & vdet );
1319 friend vec3d ToCartesian( const vec3d & v );
1320
1321 friend void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1322};
1323
1364
1365double dist( const vec3d& a, const vec3d& b );
1366
1406
1407double dist_squared( const vec3d& a, const vec3d& b );
1408
1443
1444double dot( const vec3d& a, const vec3d& b );
1445
1485
1486vec3d cross( const vec3d& a, const vec3d& b );
1487
1524
1525double angle( const vec3d& a, const vec3d& b );
1526
1567
1568double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1569 // TODO: verify description
1613
1614double cos_angle( const vec3d& a, const vec3d& b );
1615
1656
1657vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1658
1659
1660namespace std
1661{
1679
1680string to_string( const vec3d &v);
1681}
1682
1683vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1684
1710
1711void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1712
1713// Vector version that does not branch on magnitude of values.
1733
1734vec3d compsum( const std::vector < vec3d > &x );
1735
1736// Perform compensated summation of a vector of values. Should be robust to rounding errors when some elements of x
1737// are substantially smaller than the running sum. And vis-versa.
1738template < typename T >
1739T compsum( const std::vector < T > &x )
1740{
1741 T e(0.0); // constructor must set to zero
1742 T sum(0.0);
1743
1744 for ( int i = 0; i < x.size(); i++ )
1745 {
1746 T t = sum + x[i];
1747 if ( std::abs( sum ) >= std::abs( x[i] ) )
1748 {
1749 e += ( sum - t ) + x[i];
1750 }
1751 else
1752 {
1753 e += ( x[i] - t ) + sum;
1754 }
1755 sum = t;
1756 }
1757 sum += e;
1758
1759 return sum;
1760}
1761
1762bool raySphereIntersectionFromInside ( const vec3d &p, const vec3d &v, const vec3d &c, double r, vec3d &x );
1763
1764#endif
1765
1766
1767
Definition Vec2d.h:62
friend vec3d operator-(const vec3d &a, const vec3d &b)
vec3d & set_x(double xx)
friend double dot(const vec3d &a, const vec3d &b)
vec3d & set_xyz(double xx, double yy, double zz)
void offset_z(double offset)
Definition Vec3d.h:894
void scale_z(double scale)
Definition Vec3d.h:797
friend void FitPlane(const std::vector< vec3d > &pts, vec3d &cen, vec3d &norm)
friend double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
double y() const
Definition Vec3d.h:563
double x() const
Definition Vec3d.h:531
void offset_x(double offset)
Definition Vec3d.h:830
void rotate_x(double theta)
void rotate_z(double theta)
void scale_y(double scale)
Definition Vec3d.h:765
friend vec3d operator+(const vec3d &a, const vec3d &b)
double mag() const
friend vec3d operator*(const vec3d &a, double b)
friend vec3d operator/(const vec3d &a, double b)
vec3d reflect_yz() const
Definition Vec3d.h:1021
vec3d & set_z(double zz)
double z() const
Definition Vec3d.h:595
friend vec3d operator*(const vec3d &a, const vec3d &b)
friend vec3d cross(const vec3d &a, const vec3d &b)
friend double angle(const vec3d &a, const vec3d &b)
void offset_y(double offset)
Definition Vec3d.h:862
void scale_x(double scale)
Definition Vec3d.h:733
void normalize()
vec3d & set_y(double yy)
friend double dist(const vec3d &a, const vec3d &b)
friend double cos_angle(const vec3d &a, const vec3d &b)
friend vec3d RotateArbAxis(const vec3d &p, double theta, const vec3d &r)
void rotate_y(double theta)
vec3d reflect_xz() const
Definition Vec3d.h:988
vec3d reflect_xy() const
Definition Vec3d.h:955
friend double dist_squared(const vec3d &a, const vec3d &b)
Definition Vec3d.h:238
vec3d operator-(const vec3d &a, const vec3d &b)
double dot(const vec3d &a, const vec3d &b)
void FitPlane(const std::vector< vec3d > &pts, vec3d &cen, vec3d &norm)
double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
bool isnan() const
vec3d & set_refx(const vec3d &a)
vec3d & set_refz(const vec3d &a)
int major_comp() const
vec3d compsum(const std::vector< vec3d > &x)
vec3d operator+(const vec3d &a, const vec3d &b)
vec3d operator*(const vec3d &a, double b)
vec3d operator/(const vec3d &a, double b)
vec3d & set_refy(const vec3d &a)
double magsq() const
void print(const char *label="") const
vec3d cross(const vec3d &a, const vec3d &b)
string to_string(const vec3d &v)
double angle(const vec3d &a, const vec3d &b)
vec3d & set_vec(const std::vector< double > &a)
void offset_i(double offset, int idir)
Definition Vec3d.h:922
bool isfinite() const
double dist(const vec3d &a, const vec3d &b)
double cos_angle(const vec3d &a, const vec3d &b)
bool isinf() const
vec3d RotateArbAxis(const vec3d &p, double theta, const vec3d &r)
int minor_comp() const
double dist_squared(const vec3d &a, const vec3d &b)