OpenVSP API Documentation 3.45.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
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 ~vec3d() {} // delete vec3d
253
254 vec3d( double xx, double yy, double zz );
255
256 vec3d( const vec3d& a ); // vec3d x = y
257
258 vec3d( const threed_point_type &a );
259
260 vec3d( const double a[3] );
261 vec3d( const float a[3] );
262 vec3d( const std::vector<double> &a );
263
264 vec3d& operator=( const vec3d& a ); // x = y
265 vec3d& operator=( const vec2d& a );
266 vec3d& operator=( double a ); // x = 35.
267 vec3d& operator=( const threed_point_type &a );
268
269 double& operator [] ( int i )
270 {
271 return v[i];
272 }
273 const double& operator [] ( int i ) const
274 {
275 return v[i];
276 }
277
278 vec2d as_vec2d_xy();
279
280 // Set Point Values
305
306 vec3d& set_xyz( double xx, double yy, double zz );
307
308 vec3d& set_vec( const std::vector<double> &a );
309 vec3d& set_arr( const double a[] );
310 vec3d& set_arr( const float a[] );
333
334 vec3d& set_x( double xx );
335
358
359 vec3d& set_y( double yy );
360
383
384 vec3d& set_z( double zz );
385
386
387 vec3d& set_refx( const vec3d &a );
388 vec3d& set_refy( const vec3d &a );
389 vec3d& set_refz( const vec3d &a );
390
391 // Get Point Values
392 void get_pnt( double pnt[3] ) const
393 {
394 pnt[0] = v[0];
395 pnt[1] = v[1];
396 pnt[2] = v[2];
397 }
398 void get_pnt( float pnt[3] ) const
399 {
400 pnt[0] = ( float )v[0];
401 pnt[1] = ( float )v[1];
402 pnt[2] = ( float )v[2];
403 }
404 void get_pnt( threed_point_type &pnt ) const;
405
437
438 double x() const
439
440 {
441 return( v[0] );
442 }
443
474
475 double y() const
476
477 {
478 return( v[1] );
479 }
480
511
512 double z() const
513
514 {
515 return( v[2] );
516 }
517
518 double* data()
519 {
520 return( v );
521 }
522
523 void Transform( const Matrix4d &m );
524 void FlipNormal() {};
525
526 // Rotate About Axis --> Change Internal Values
555
556 void rotate_x( double theta );
557
586
587 void rotate_y( double theta );
588
617
618 void rotate_z( double theta );
619
620 // Scale Up Single Coord --> Change Internal Values
648
649 void scale_x( double scale )
650
651 {
652 v[0] *= scale;
653 };
654
681
682 void scale_y( double scale )
683
684 {
685 v[1] *= scale;
686 };
687
714
715 void scale_z( double scale )
716
717 {
718 v[2] *= scale;
719 };
720
748
749 void offset_x( double offset )
750
751 {
752 v[0] += offset;
753 };
754
781
782 void offset_y( double offset )
783
784 {
785 v[1] += offset;
786 };
787
814
815 void offset_z( double offset )
816
817 {
818 v[2] += offset;
819 };
820 void offset_i( double offset, int idir )
821 {
822 v[idir] += offset;
823 };
824
852
853 vec3d reflect_xy() const
854
855 {
856 return( vec3d( v[0], v[1], -v[2] ) );
857 }
858
885
886 vec3d reflect_xz() const
887
888 {
889 return( vec3d( v[0], -v[1], v[2] ) );
890 }
891
918
919 vec3d reflect_yz() const
920
921 {
922 return( vec3d( -v[0], v[1], v[2] ) );
923 }
924
925 vec3d swap_xy() const
926 {
927 return( vec3d( v[1], v[0], v[2] ) );
928 }
929 vec3d swap_xz() const
930 {
931 return( vec3d( v[2], v[1], v[0] ) );
932 }
933 vec3d swap_yz() const
934 {
935 return( vec3d( v[0], v[2], v[1] ) );
936 }
937
938 // x = a + b, x = a - b, a*scale, a/scale
939 friend vec3d operator+( const vec3d& a, const vec3d& b );
940 friend vec3d operator-( const vec3d& a, const vec3d& b );
941 friend vec3d operator*( const vec3d& a, double b );
942 friend vec3d operator*( double b, const vec3d& a );
943 friend vec3d operator*( const vec3d& a, const vec3d& b );
944 friend vec3d operator/( const vec3d& a, double b );
945 vec3d& operator+=( const vec3d& b );
946 vec3d& operator-=( const vec3d& b );
947 vec3d& operator*=( double b );
948 vec3d& operator+=( double b[] );
949 vec3d& operator-=( double b[] );
950 vec3d& operator+=( float b[] );
951 vec3d& operator-=( float b[] );
952
953 friend vec3d operator-( const vec3d & in );
954
955 friend bool operator==( const vec3d &a, const vec3d& b );
956 friend bool operator!=( const vec3d &a, const vec3d& b );
957
958 // cout << a
959// friend ostream& operator<< (ostream& out, const vec3d& a);
960
961 friend double dist( const vec3d& a, const vec3d& b );
962 friend double dist_squared( const vec3d& a, const vec3d& b );
963
992
993 double mag() const; // x = a.mag()
994
995 double magsq() const;
996
1029
1030 void normalize(); // a.normalize()
1031
1032
1033 int major_comp() const;
1034 int minor_comp() const;
1035
1036 bool isnan() const;
1037 bool isinf() const;
1038 bool isfinite() const;
1039
1040 void print( const char* label = "" ) const;
1041
1042 friend double dot( const vec3d& a, const vec3d& b ); // x = dot(a,b)
1043 friend vec3d cross( const vec3d& a, const vec3d& b ); // a = cross(b,c)
1044 friend double angle( const vec3d& a, const vec3d& b );
1045 friend double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1046 friend double cos_angle( const vec3d& a, const vec3d& b );
1047 friend double radius_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1048 friend void center_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d& center );
1049 friend bool triangle_plane_intersect_test( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1050 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 );
1051 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 );
1052 friend bool plane_plane_intersection( const vec3d &p0, const vec3d &n0, const vec3d &p1, const vec3d &n1, vec3d &p, vec3d &v );
1053 friend double angle_pnt_2_plane( const vec3d& ptplane, vec3d norm, const vec3d& ptaxis, vec3d axis, const vec3d &pt, int ccw, vec3d &prot );
1054 friend double signed_dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1055 friend double dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1056 friend double dist_pnt_2_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1057 friend double dist_pnt_2_ray( const vec3d& line_pt1, const vec3d& dir_unit_vec, const vec3d& pnt );
1058// friend double dist_pnt_2_line_seg( vec3d& line_pt1, vec3d& line_pt2, vec3d& pnt);
1059 friend vec3d proj_u_on_v( const vec3d& u, const vec3d& v );
1060 friend vec3d proj_pnt_on_line_seg( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1061 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt );
1062 friend vec3d proj_pnt_on_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1063 friend vec3d proj_pnt_to_plane( const vec3d& org, const vec3d& plane_ln1, const vec3d& plane_ln2, const vec3d& pnt );
1064 friend vec3d proj_vec_to_plane( const vec3d& vec, const vec3d& norm );
1065 friend int tri_seg_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1066 double& u, double& w, double& t );
1067 friend int tri_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1068 double& u, double& w, double& t );
1069 friend int plane_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E, double& t );
1070 friend int plane_ray_intersect( const vec3d& orig, const vec3d& norm, const vec3d& D, const vec3d& E, double& t );
1071 friend int ray_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, vec3d& int_pnt1, vec3d& int_pnt2 );
1072 friend double tetra_volume( const vec3d& A, const vec3d& B, const vec3d& C );
1073 friend double area( const vec3d& A, const vec3d& B, const vec3d& C );
1074 friend double poly_area( const std::vector< vec3d > & pnt_vec );
1075 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1 );
1076 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1,
1077 double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1078 friend double nearSegSeg( const vec3d& L0, const vec3d& L1, const vec3d& S0, const vec3d& S1, double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1079 friend double pointLineDistSquared( const vec3d & p, const vec3d& lp0, const vec3d& lp1, double &t, vec3d &pon );
1080 friend double pointSegDistSquared( const vec3d& p, const vec3d& sp0, const vec3d& sp1, double &t, vec3d &pon );
1081 friend vec3d point_on_line( const vec3d & lp0, const vec3d & lp1, const double & t );
1082
1083 friend vec2d MapToPlane( const vec3d & p, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1084 friend vec3d MapFromPlane( const vec2d & uw, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1085
1086 friend int plane_half_space( const vec3d & planeOrig, const vec3d & planeNorm, const vec3d & pnt );
1087
1088 friend bool line_line_intersect( const vec3d & p1, const vec3d & p2, const vec3d & p3, const vec3d & p4, double* s, double* t );
1089
1090 friend vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1091
1092 friend bool PtInTri( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1093 friend vec3d BarycentricWeights( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1094 friend void BilinearWeights( const vec3d & p0, const vec3d & p1, const vec3d & p, std::vector< double > & weights );
1095 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 );
1096 friend double pnt_tri_min_dist( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & pnt, vec3d &pnearest );
1097
1098 friend vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1099 friend void printpt( const vec3d & v );
1100 friend vec3d ToSpherical( const vec3d & v );
1101 friend vec3d ToSpherical2( const vec3d & v, const vec3d & vdet );
1102 friend vec3d ToCartesian( const vec3d & v );
1103
1104 friend void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1105};
1106
1147
1148double dist( const vec3d& a, const vec3d& b );
1149
1189
1190double dist_squared( const vec3d& a, const vec3d& b );
1191
1226
1227double dot( const vec3d& a, const vec3d& b );
1228
1267
1268vec3d cross( const vec3d& a, const vec3d& b );
1269
1306
1307double angle( const vec3d& a, const vec3d& b );
1308
1348
1349double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1350 // TODO: verify description
1394
1395double cos_angle( const vec3d& a, const vec3d& b );
1396
1436
1437vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1438
1439
1440namespace std
1441{
1442string to_string( const vec3d &v);
1443}
1444
1445vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1446
1447void FitPlane( const std::vector < vec3d > & pts, vec3d & cen, vec3d & norm );
1448
1449// Vector version that does not branch on magnitude of values.
1450vec3d compsum( const std::vector < vec3d > &x );
1451
1452// Perform compensated summation of a vector of values. Should be robust to rounding errors when some elements of x
1453// are substantially smaller than the running sum. And vis-versa.
1454template < typename T >
1455T compsum( const std::vector < T > &x )
1456{
1457 T e(0.0); // constructor must set to zero
1458 T sum(0.0);
1459
1460 for ( int i = 0; i < x.size(); i++ )
1461 {
1462 T t = sum + x[i];
1463 if ( std::abs( sum ) >= std::abs( x[i] ) )
1464 {
1465 e += ( sum - t ) + x[i];
1466 }
1467 else
1468 {
1469 e += ( x[i] - t ) + sum;
1470 }
1471 sum = t;
1472 }
1473 sum += e;
1474
1475 return sum;
1476}
1477
1478#endif
1479
1480
1481
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:815
void scale_z(double scale)
Definition Vec3d.h:715
friend double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
double y() const
Definition Vec3d.h:475
double x() const
Definition Vec3d.h:438
void offset_x(double offset)
Definition Vec3d.h:749
void rotate_x(double theta)
void rotate_z(double theta)
void scale_y(double scale)
Definition Vec3d.h:682
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:919
vec3d & set_z(double zz)
double z() const
Definition Vec3d.h:512
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:782
void scale_x(double scale)
Definition Vec3d.h:649
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:886
vec3d reflect_xy() const
Definition Vec3d.h:853
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)