OpenVSP API Documentation 3.51.2
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
36class vec3d;
37class Matrix4d;
38
39//==== Forward declare to get around MS Compiler bug ====//
75
76vec3d operator+( const vec3d& a, const vec3d& b );
77
114
115vec3d operator-( const vec3d& a, const vec3d& b );
116
154
155vec3d operator*( const vec3d& a, double b );
156
194
195vec3d operator*( const vec3d& a, const vec3d& b );
196
234
235vec3d operator/( const vec3d& a, double b );
236
237
242class vec3d
243{
244private:
245
246
247public:
248 double v[3];
249
250 vec3d(); // vec3d x or new vec3d
251
252 // The copy constructor, copy assignment operator, and destructor are intentionally left implicit.
253 // This keeps vec3d trivially copyable, so vector<vec3d> copies can use the memmove fast path
254 // instead of calling an out-of-line function per element.
255#ifdef SWIG
256 vec3d( const vec3d& a ); // vec3d x = y -- implicit in C++, declared so SWIG wraps it for the bindings.
257#endif
258
259 vec3d( double xx, double yy, double zz );
260
261 vec3d( const threed_point_type &a );
262
263 vec3d( const double a[3] );
264 vec3d( const float a[3] );
265 vec3d( const std::vector<double> &a );
266
267 vec3d& operator=( const vec2d& a );
268 vec3d& operator=( double a ); // x = 35.
269 vec3d& operator=( const threed_point_type &a );
270
271 double& operator [] ( int i )
272 {
273 return v[i];
274 }
275 const double& operator [] ( int i ) const
276 {
277 return v[i];
278 }
279
280 vec2d as_vec2d_xy();
281
282 // Set Point Values
307
308 vec3d& set_xyz( double xx, double yy, double zz );
309
310 vec3d& set_vec( const std::vector<double> &a );
311 vec3d& set_arr( const double a[] );
312 vec3d& set_arr( const float a[] );
335
336 vec3d& set_x( double xx );
337
360
361 vec3d& set_y( double yy );
362
385
386 vec3d& set_z( double zz );
387
388
389 vec3d& set_refx( const vec3d &a );
390 vec3d& set_refy( const vec3d &a );
391 vec3d& set_refz( const vec3d &a );
392
393 // Get Point Values
394 void get_pnt( double pnt[3] ) const
395 {
396 pnt[0] = v[0];
397 pnt[1] = v[1];
398 pnt[2] = v[2];
399 }
400 void get_pnt( float pnt[3] ) const
401 {
402 pnt[0] = ( float )v[0];
403 pnt[1] = ( float )v[1];
404 pnt[2] = ( float )v[2];
405 }
406 void get_pnt( threed_point_type &pnt ) const;
407
439
440 double x() const
441
442 {
443 return( v[0] );
444 }
445
476
477 double y() const
478
479 {
480 return( v[1] );
481 }
482
513
514 double z() const
515
516 {
517 return( v[2] );
518 }
519
520 double* data()
521 {
522 return( v );
523 }
524
525 void Transform( const Matrix4d &m );
526 void FlipNormal() {};
527
528 // Rotate About Axis --> Change Internal Values
557
558 void rotate_x( double theta );
559
588
589 void rotate_y( double theta );
590
619
620 void rotate_z( double theta );
621
622 // Scale Up Single Coord --> Change Internal Values
650
651 void scale_x( double scale )
652
653 {
654 v[0] *= scale;
655 };
656
683
684 void scale_y( double scale )
685
686 {
687 v[1] *= scale;
688 };
689
716
717 void scale_z( double scale )
718
719 {
720 v[2] *= scale;
721 };
722
750
751 void offset_x( double offset )
752
753 {
754 v[0] += offset;
755 };
756
783
784 void offset_y( double offset )
785
786 {
787 v[1] += offset;
788 };
789
816
817 void offset_z( double offset )
818
819 {
820 v[2] += offset;
821 };
822 void offset_i( double offset, int idir )
823 {
824 v[idir] += offset;
825 };
826
854
855 vec3d reflect_xy() const
856
857 {
858 return( vec3d( v[0], v[1], -v[2] ) );
859 }
860
887
888 vec3d reflect_xz() const
889
890 {
891 return( vec3d( v[0], -v[1], v[2] ) );
892 }
893
920
921 vec3d reflect_yz() const
922
923 {
924 return( vec3d( -v[0], v[1], v[2] ) );
925 }
926
927 vec3d swap_xy() const
928 {
929 return( vec3d( v[1], v[0], v[2] ) );
930 }
931 vec3d swap_xz() const
932 {
933 return( vec3d( v[2], v[1], v[0] ) );
934 }
935 vec3d swap_yz() const
936 {
937 return( vec3d( v[0], v[2], v[1] ) );
938 }
939
940 // x = a + b, x = a - b, a*scale, a/scale
941 friend vec3d operator+( const vec3d& a, const vec3d& b );
942 friend vec3d operator-( const vec3d& a, const vec3d& b );
943 friend vec3d operator*( const vec3d& a, double b );
944 friend vec3d operator*( double b, const vec3d& a );
945 friend vec3d operator*( const vec3d& a, const vec3d& b );
946 friend vec3d operator/( const vec3d& a, double b );
947 vec3d& operator+=( const vec3d& b );
948 vec3d& operator-=( const vec3d& b );
949 vec3d& operator*=( double b );
950 vec3d& operator+=( double b[] );
951 vec3d& operator-=( double b[] );
952 vec3d& operator+=( float b[] );
953 vec3d& operator-=( float b[] );
954
955 friend vec3d operator-( const vec3d & in );
956
957 friend bool operator==( const vec3d &a, const vec3d& b );
958 friend bool operator!=( const vec3d &a, const vec3d& b );
959
960 // cout << a
961// friend ostream& operator<< (ostream& out, const vec3d& a);
962
963 friend double dist( const vec3d& a, const vec3d& b );
964 friend double dist_squared( const vec3d& a, const vec3d& b );
965
994
995 double mag() const; // x = a.mag()
996
997 double magsq() const;
998
1031
1032 void normalize(); // a.normalize()
1033
1034
1035 int major_comp() const;
1036 int minor_comp() const;
1037
1038 bool isnan() const;
1039 bool isinf() const;
1040 bool isfinite() const;
1041
1042 void print( const char* label = "" ) const;
1043
1044 friend double dot( const vec3d& a, const vec3d& b ); // x = dot(a,b)
1045 friend vec3d cross( const vec3d& a, const vec3d& b ); // a = cross(b,c)
1046 friend double angle( const vec3d& a, const vec3d& b );
1047 friend double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1048 friend double cos_angle( const vec3d& a, const vec3d& b );
1049 friend double radius_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1050 friend void center_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d& center );
1051 friend bool triangle_plane_intersect_test( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1052 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 );
1053 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 );
1054 friend bool plane_plane_intersection( const vec3d &p0, const vec3d &n0, const vec3d &p1, const vec3d &n1, vec3d &p, vec3d &v );
1055 friend double angle_pnt_2_plane( const vec3d& ptplane, vec3d norm, const vec3d& ptaxis, vec3d axis, const vec3d &pt, int ccw, vec3d &prot );
1056 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 );
1057 friend double signed_dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1058 friend double dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1059 friend double dist_pnt_2_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1060 friend double dist_pnt_2_ray( const vec3d& line_pt1, const vec3d& dir_unit_vec, const vec3d& pnt );
1061// friend double dist_pnt_2_line_seg( vec3d& line_pt1, vec3d& line_pt2, vec3d& pnt);
1062 friend vec3d proj_u_on_v( const vec3d& u, const vec3d& v );
1063 friend vec3d proj_pnt_on_line_seg( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1064 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt );
1065 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt, double &t );
1066 friend vec3d proj_pnt_on_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1067 friend vec3d proj_pnt_to_plane( const vec3d& org, const vec3d& plane_ln1, const vec3d& plane_ln2, const vec3d& pnt );
1068 friend vec3d proj_vec_to_plane( const vec3d& vec, const vec3d& norm );
1069 friend int tri_seg_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1070 double& u, double& w, double& t );
1071 friend int tri_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1072 double& u, double& w, double& t );
1073 friend int plane_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E, double& t );
1074 friend int plane_ray_intersect( const vec3d& orig, const vec3d& norm, const vec3d& D, const vec3d& E, double& t );
1075 friend int ray_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, vec3d& int_pnt1, vec3d& int_pnt2 );
1076 friend double tetra_volume( const vec3d& A, const vec3d& B, const vec3d& C );
1077 friend double area( const vec3d& A, const vec3d& B, const vec3d& C );
1078 friend double poly_area( const std::vector< vec3d > & pnt_vec );
1079 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1 );
1080 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1,
1081 double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1082 friend double nearSegSeg( const vec3d& L0, const vec3d& L1, const vec3d& S0, const vec3d& S1, double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1083 friend double pointLineDistSquared( const vec3d & p, const vec3d& lp0, const vec3d& lp1, double &t, vec3d &pon );
1084 friend double pointSegDistSquared( const vec3d& p, const vec3d& sp0, const vec3d& sp1, double &t, vec3d &pon );
1085 friend vec3d point_on_line( const vec3d & lp0, const vec3d & lp1, const double & t );
1086
1087 friend vec2d MapToPlane( const vec3d & p, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1088 friend vec3d MapFromPlane( const vec2d & uw, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1089
1090 friend int plane_half_space( const vec3d & planeOrig, const vec3d & planeNorm, const vec3d & pnt );
1091
1092 friend bool line_line_intersect( const vec3d & p1, const vec3d & p2, const vec3d & p3, const vec3d & p4, double* s, double* t );
1093
1094 friend vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1095
1096 friend bool PtInTri( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1097 friend vec3d BarycentricWeights( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1098 friend void BilinearWeights( const vec3d & p0, const vec3d & p1, const vec3d & p, std::vector< double > & weights );
1099 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 );
1100 friend double pnt_tri_min_dist( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & pnt, vec3d &pnearest );
1101
1102 friend vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1103 friend void printpt( const vec3d & v );
1104 friend vec3d ToSpherical( const vec3d & v );
1105 friend vec3d ToSpherical2( const vec3d & v, const vec3d & vdet );
1106 friend vec3d ToCartesian( const vec3d & v );
1107
1108 friend void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1109};
1110
1151
1152double dist( const vec3d& a, const vec3d& b );
1153
1193
1194double dist_squared( const vec3d& a, const vec3d& b );
1195
1230
1231double dot( const vec3d& a, const vec3d& b );
1232
1271
1272vec3d cross( const vec3d& a, const vec3d& b );
1273
1310
1311double angle( const vec3d& a, const vec3d& b );
1312
1352
1353double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1354 // TODO: verify description
1398
1399double cos_angle( const vec3d& a, const vec3d& b );
1400
1440
1441vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1442
1443
1444namespace std
1445{
1446string to_string( const vec3d &v);
1447}
1448
1449vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1450
1451void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1452
1453// Vector version that does not branch on magnitude of values.
1454vec3d compsum( const std::vector < vec3d > &x );
1455
1456// Perform compensated summation of a vector of values. Should be robust to rounding errors when some elements of x
1457// are substantially smaller than the running sum. And vis-versa.
1458template < typename T >
1459T compsum( const std::vector < T > &x )
1460{
1461 T e(0.0); // constructor must set to zero
1462 T sum(0.0);
1463
1464 for ( int i = 0; i < x.size(); i++ )
1465 {
1466 T t = sum + x[i];
1467 if ( std::abs( sum ) >= std::abs( x[i] ) )
1468 {
1469 e += ( sum - t ) + x[i];
1470 }
1471 else
1472 {
1473 e += ( x[i] - t ) + sum;
1474 }
1475 sum = t;
1476 }
1477 sum += e;
1478
1479 return sum;
1480}
1481
1482bool raySphereIntersectionFromInside ( const vec3d &p, const vec3d &v, const vec3d &c, double r, vec3d &x );
1483
1484#endif
1485
1486
1487
Definition Vec3d.h:243
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:817
void scale_z(double scale)
Definition Vec3d.h:717
friend double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
double y() const
Definition Vec3d.h:477
double x() const
Definition Vec3d.h:440
void offset_x(double offset)
Definition Vec3d.h:751
void rotate_x(double theta)
void rotate_z(double theta)
void scale_y(double scale)
Definition Vec3d.h:684
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:921
vec3d & set_z(double zz)
double z() const
Definition Vec3d.h:514
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:784
void scale_x(double scale)
Definition Vec3d.h:651
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:888
vec3d reflect_xy() const
Definition Vec3d.h:855
friend double dist_squared(const vec3d &a, const vec3d &b)
vec3d operator-(const vec3d &a, const vec3d &b)
double dot(const vec3d &a, const vec3d &b)
double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
vec3d operator+(const vec3d &a, const vec3d &b)
vec3d operator*(const vec3d &a, double b)
vec3d operator/(const vec3d &a, double b)
vec3d cross(const vec3d &a, const vec3d &b)
double angle(const vec3d &a, const vec3d &b)
double dist(const vec3d &a, const vec3d &b)
double cos_angle(const vec3d &a, const vec3d &b)
vec3d RotateArbAxis(const vec3d &p, double theta, const vec3d &r)
double dist_squared(const vec3d &a, const vec3d &b)