OpenVSP API Documentation 3.44.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#include "Defines.h"
17#include "Vec2d.h"
18
19#include "eli/code_eli.hpp"
20typedef Eigen::Matrix< double, 1, 3 > threed_point_type;
21
22#include <iostream>
23#include <vector>
24
29class vec3d;
30class Matrix4d;
31
32//==== Forward declare to get around MS Compiler bug ====//
68
69vec3d operator+( const vec3d& a, const vec3d& b );
70
107
108vec3d operator-( const vec3d& a, const vec3d& b );
109
147
148vec3d operator*( const vec3d& a, double b );
149
187
188vec3d operator*( const vec3d& a, const vec3d& b );
189
227
228vec3d operator/( const vec3d& a, double b );
229
230
235class vec3d
236{
237private:
238
239
240public:
241 double v[3];
242
243 vec3d(); // vec3d x or new vec3d
244
245 ~vec3d() {} // delete vec3d
246
247 vec3d( double xx, double yy, double zz );
248
249 vec3d( const vec3d& a ); // vec3d x = y
250
251 vec3d( const threed_point_type &a );
252
253 vec3d( const double a[3] );
254 vec3d( const float a[3] );
255 vec3d( const std::vector<double> &a );
256
257 vec3d& operator=( const vec3d& a ); // x = y
258 vec3d& operator=( const vec2d& a );
259 vec3d& operator=( double a ); // x = 35.
260 vec3d& operator=( const threed_point_type &a );
261
262 double& operator [] ( int i )
263 {
264 return v[i];
265 }
266 const double& operator [] ( int i ) const
267 {
268 return v[i];
269 }
270
271 vec2d as_vec2d_xy();
272
273 // Set Point Values
298
299 vec3d& set_xyz( double xx, double yy, double zz );
300
301 vec3d& set_vec( const std::vector<double> &a );
302 vec3d& set_arr( const double a[] );
303 vec3d& set_arr( const float a[] );
326
327 vec3d& set_x( double xx );
328
351
352 vec3d& set_y( double yy );
353
376
377 vec3d& set_z( double zz );
378
379
380 vec3d& set_refx( const vec3d &a );
381 vec3d& set_refy( const vec3d &a );
382 vec3d& set_refz( const vec3d &a );
383
384 // Get Point Values
385 void get_pnt( double pnt[3] ) const
386 {
387 pnt[0] = v[0];
388 pnt[1] = v[1];
389 pnt[2] = v[2];
390 }
391 void get_pnt( float pnt[3] ) const
392 {
393 pnt[0] = ( float )v[0];
394 pnt[1] = ( float )v[1];
395 pnt[2] = ( float )v[2];
396 }
397 void get_pnt( threed_point_type &pnt ) const
398 {
399 pnt[0] = v[0];
400 pnt[1] = v[1];
401 pnt[2] = v[2];
402 }
403
435
436 double x() const
437
438 {
439 return( v[0] );
440 }
441
472
473 double y() const
474
475 {
476 return( v[1] );
477 }
478
509
510 double z() const
511
512 {
513 return( v[2] );
514 }
515
516 double* data()
517 {
518 return( v );
519 }
520
521 void Transform( const Matrix4d &m );
522 void FlipNormal() {};
523
524 // Rotate About Axis --> Change Internal Values
553
554 void rotate_x( double theta );
555
584
585 void rotate_y( double theta );
586
615
616 void rotate_z( double theta );
617
618 // Scale Up Single Coord --> Change Internal Values
646
647 void scale_x( double scale )
648
649 {
650 v[0] *= scale;
651 };
652
679
680 void scale_y( double scale )
681
682 {
683 v[1] *= scale;
684 };
685
712
713 void scale_z( double scale )
714
715 {
716 v[2] *= scale;
717 };
718
746
747 void offset_x( double offset )
748
749 {
750 v[0] += offset;
751 };
752
779
780 void offset_y( double offset )
781
782 {
783 v[1] += offset;
784 };
785
812
813 void offset_z( double offset )
814
815 {
816 v[2] += offset;
817 };
818 void offset_i( double offset, int idir )
819 {
820 v[idir] += offset;
821 };
822
850
851 vec3d reflect_xy() const
852
853 {
854 return( vec3d( v[0], v[1], -v[2] ) );
855 }
856
883
884 vec3d reflect_xz() const
885
886 {
887 return( vec3d( v[0], -v[1], v[2] ) );
888 }
889
916
917 vec3d reflect_yz() const
918
919 {
920 return( vec3d( -v[0], v[1], v[2] ) );
921 }
922
923 vec3d swap_xy() const
924 {
925 return( vec3d( v[1], v[0], v[2] ) );
926 }
927 vec3d swap_xz() const
928 {
929 return( vec3d( v[2], v[1], v[0] ) );
930 }
931 vec3d swap_yz() const
932 {
933 return( vec3d( v[0], v[2], v[1] ) );
934 }
935
936 // x = a + b, x = a - b, a*scale, a/scale
937 friend vec3d operator+( const vec3d& a, const vec3d& b );
938 friend vec3d operator-( const vec3d& a, const vec3d& b );
939 friend vec3d operator*( const vec3d& a, double b );
940 friend vec3d operator*( double b, const vec3d& a );
941 friend vec3d operator*( const vec3d& a, const vec3d& b );
942 friend vec3d operator/( const vec3d& a, double b );
943 vec3d& operator+=( const vec3d& b );
944 vec3d& operator-=( const vec3d& b );
945 vec3d& operator*=( double b );
946 vec3d& operator+=( double b[] );
947 vec3d& operator-=( double b[] );
948 vec3d& operator+=( float b[] );
949 vec3d& operator-=( float b[] );
950
951 friend vec3d operator-( const vec3d & in );
952
953 friend bool operator==( const vec3d &a, const vec3d& b );
954 friend bool operator!=( const vec3d &a, const vec3d& b );
955
956 // cout << a
957// friend ostream& operator<< (ostream& out, const vec3d& a);
958
959 friend double dist( const vec3d& a, const vec3d& b );
960 friend double dist_squared( const vec3d& a, const vec3d& b );
961
990
991 double mag() const; // x = a.mag()
992
993 double magsq() const;
994
1027
1028 void normalize(); // a.normalize()
1029
1030
1031 int major_comp() const;
1032 int minor_comp() const;
1033
1034 bool isnan() const;
1035 bool isinf() const;
1036 bool isfinite() const;
1037
1038 void print( const char* label = "" ) const;
1039
1040 friend double dot( const vec3d& a, const vec3d& b ); // x = dot(a,b)
1041 friend vec3d cross( const vec3d& a, const vec3d& b ); // a = cross(b,c)
1042 friend double angle( const vec3d& a, const vec3d& b );
1043 friend double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1044 friend double cos_angle( const vec3d& a, const vec3d& b );
1045 friend double radius_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1046 friend void center_of_circle( const vec3d& p1, const vec3d& p2, const vec3d& p3, vec3d& center );
1047 friend bool triangle_plane_intersect_test( const vec3d& org, const vec3d& norm, const vec3d& p1, const vec3d& p2, const vec3d& p3 );
1048 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 );
1049 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 );
1050 friend bool plane_plane_intersection( const vec3d &p0, const vec3d &n0, const vec3d &p1, const vec3d &n1, vec3d &p, vec3d &v );
1051 friend double angle_pnt_2_plane( const vec3d& ptplane, vec3d norm, const vec3d& ptaxis, vec3d axis, const vec3d &pt, int ccw, vec3d &prot );
1052 friend double signed_dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1053 friend double dist_pnt_2_plane( const vec3d& org, const vec3d& norm, const vec3d& pnt );
1054 friend double dist_pnt_2_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1055 friend double dist_pnt_2_ray( const vec3d& line_pt1, const vec3d& dir_unit_vec, const vec3d& pnt );
1056// friend double dist_pnt_2_line_seg( vec3d& line_pt1, vec3d& line_pt2, vec3d& pnt);
1057 friend vec3d proj_u_on_v( const vec3d& u, const vec3d& v );
1058 friend vec3d proj_pnt_on_line_seg( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1059 friend vec3d proj_pnt_on_ray( const vec3d& line_pt1, const vec3d& line_dir, const vec3d& pnt );
1060 friend vec3d proj_pnt_on_line( const vec3d& line_pt1, const vec3d& line_pt2, const vec3d& pnt );
1061 friend vec3d proj_pnt_to_plane( const vec3d& org, const vec3d& plane_ln1, const vec3d& plane_ln2, const vec3d& pnt );
1062 friend vec3d proj_vec_to_plane( const vec3d& vec, const vec3d& norm );
1063 friend int tri_seg_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E,
1064 double& u, double& w, double& t );
1065 friend int tri_ray_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 plane_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, const vec3d& E, double& t );
1068 friend int plane_ray_intersect( const vec3d& orig, const vec3d& norm, const vec3d& D, const vec3d& E, double& t );
1069 friend int ray_ray_intersect( const vec3d& A, const vec3d& B, const vec3d& C, const vec3d& D, vec3d& int_pnt1, vec3d& int_pnt2 );
1070 friend double tetra_volume( const vec3d& A, const vec3d& B, const vec3d& C );
1071 friend double area( const vec3d& A, const vec3d& B, const vec3d& C );
1072 friend double poly_area( const std::vector< vec3d > & pnt_vec );
1073 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1 );
1074 friend double dist3D_Segment_to_Segment( const vec3d& S1P0, const vec3d& S1P1, const vec3d& S2P0, const vec3d& S2P1,
1075 double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1076 friend double nearSegSeg( const vec3d& L0, const vec3d& L1, const vec3d& S0, const vec3d& S1, double* Lt, vec3d* Ln, double* St, vec3d* Sn );
1077 friend double pointLineDistSquared( const vec3d & p, const vec3d& lp0, const vec3d& lp1, double &t, vec3d &pon );
1078 friend double pointSegDistSquared( const vec3d& p, const vec3d& sp0, const vec3d& sp1, double &t, vec3d &pon );
1079 friend vec3d point_on_line( const vec3d & lp0, const vec3d & lp1, const double & t );
1080
1081 friend vec2d MapToPlane( const vec3d & p, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1082 friend vec3d MapFromPlane( const vec2d & uw, const vec3d & planeOrig, const vec3d & planeVec1, const vec3d & planeVec2 );
1083
1084 friend int plane_half_space( const vec3d & planeOrig, const vec3d & planeNorm, const vec3d & pnt );
1085
1086 friend bool line_line_intersect( const vec3d & p1, const vec3d & p2, const vec3d & p3, const vec3d & p4, double* s, double* t );
1087
1088 friend vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1089
1090 friend bool PtInTri( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1091 friend vec3d BarycentricWeights( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & p );
1092 friend void BilinearWeights( const vec3d & p0, const vec3d & p1, const vec3d & p, std::vector< double > & weights );
1093 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 );
1094 friend double pnt_tri_min_dist( const vec3d & v0, const vec3d & v1, const vec3d & v2, const vec3d & pnt, vec3d &pnearest );
1095
1096 friend vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1097 friend void printpt( const vec3d & v );
1098 friend vec3d ToSpherical( const vec3d & v );
1099 friend vec3d ToSpherical2( const vec3d & v, const vec3d & vdet );
1100 friend vec3d ToCartesian( const vec3d & v );
1101};
1102
1143
1144double dist( const vec3d& a, const vec3d& b );
1145
1185
1186double dist_squared( const vec3d& a, const vec3d& b );
1187
1222
1223double dot( const vec3d& a, const vec3d& b );
1224
1263
1264vec3d cross( const vec3d& a, const vec3d& b );
1265
1302
1303double angle( const vec3d& a, const vec3d& b );
1304
1344
1345double signed_angle( const vec3d& a, const vec3d& b, const vec3d& ref );
1346 // TODO: verify description
1390
1391double cos_angle( const vec3d& a, const vec3d& b );
1392
1432
1433vec3d RotateArbAxis( const vec3d & p, double theta, const vec3d & r );
1434
1435
1436namespace std
1437{
1438string to_string( const vec3d &v);
1439}
1440
1441vec3d slerp( const vec3d& a, const vec3d& b, const double &t );
1442
1443#endif
1444
1445
1446
Definition Vec3d.h:236
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:813
void scale_z(double scale)
Definition Vec3d.h:713
friend double signed_angle(const vec3d &a, const vec3d &b, const vec3d &ref)
double y() const
Definition Vec3d.h:473
double x() const
Definition Vec3d.h:436
void offset_x(double offset)
Definition Vec3d.h:747
void rotate_x(double theta)
void rotate_z(double theta)
void scale_y(double scale)
Definition Vec3d.h:680
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:917
vec3d & set_z(double zz)
double z() const
Definition Vec3d.h:510
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:780
void scale_x(double scale)
Definition Vec3d.h:647
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:884
vec3d reflect_xy() const
Definition Vec3d.h:851
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)