V_3D.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef V_3D_H_
00012 # define V_3D_H_
00013
00014 #include <stdlib.h>
00015 #include <iostream>
00016 #include <cmath>
00017 #include <string>
00018 #include <errno.h>
00019 #include <stdio.h>
00020 using namespace std;
00021
00022 class V_3D
00023 {
00024 public:
00025 V_3D();
00026 V_3D(const V_3D &v_3D);
00027 V_3D(double x,double y,double z);
00028 ~V_3D();
00029
00030
00031 int set(double *v);
00032 int set(int k_dim,double value);
00033 int set(V_3D _V);
00034 int set(double x,double y,double z);
00035
00036 double get(int k_dim) const;
00037 int get(double *v) const;
00038 V_3D get() const;
00039 double *get_pointer();
00040
00041
00042
00043 double dot(V_3D _v) const;
00044 V_3D vector_prod(V_3D _v) const;
00045 double norm() const;
00047
00049 V_3D normalized() const;
00050 double area(V_3D _v) const;
00051 double cos_angle(const V_3D& v) const;
00053 double angle(const V_3D& v)const;
00054
00055 V_3D get_min_scalar(const V_3D& _v) const;
00056 V_3D get_max_scalar(const V_3D& _v) const;
00057 double get_max_of_coeff() const;
00058 double get_min_of_coeff() const;
00059
00060 int equal(const V_3D& v,double epsilon) const;
00061
00062
00063 double tetrahedra_volume(const V_3D& p2,const V_3D& p3,const V_3D& p4) const;
00064 int get_barycenter_coordinates_tetrahedra(const V_3D& p1,const V_3D& p2,const V_3D& p3,const V_3D& p4,double *alpha,double *beta,double *gamma,double *delta) const;
00065 int is_inside_volume(const V_3D& p1,const V_3D& p2,const V_3D& p3,const V_3D& p4) const;
00066 double distance_to_oriented_plane(const V_3D& n,const V_3D& x0) const;
00067
00070
00071 double cos_angle_to_plane_with_normal(const V_3D& normal_to_plane) const;
00072
00073
00074 V_3D& operator=(const V_3D&);
00075 V_3D& operator+=(const V_3D&);
00076 V_3D& operator/=(const double&);
00077
00078 bool operator>=(const V_3D& ) const;
00079 bool operator>(const V_3D &) const;
00080 bool operator<=(const V_3D &) const;
00081 bool operator<(const V_3D &) const;
00082
00083 friend V_3D operator+(const V_3D& v1,const V_3D& v2);
00084 friend V_3D operator-(const V_3D& v1,const V_3D& v2);
00085 friend V_3D operator*(const V_3D& v1,const double& alpha);
00086 friend V_3D operator*(const double& alpha,const V_3D& v1);
00087 friend V_3D operator/(const V_3D& v1,const double& alpha);
00088 friend bool operator==(const V_3D& v1,const V_3D& v2);
00089 friend bool operator!=(const V_3D& v1,const V_3D& v2);
00090
00091 double& operator[](int index);
00092 double operator[](int index) const;
00093
00094 friend ostream& operator << (ostream& flux, V_3D _v);
00095
00096 private:
00097
00098 double V[3];
00099 };
00100
00101
00102 class less_V3D
00103 {
00104 public:
00105 bool operator ()(const V_3D& v0,const V_3D& v1) const
00106 {
00107
00108 double epsilon=0.0001;
00109 if( fabs(v0[0]-v1[0])<epsilon && fabs(v0[1]-v1[1])<epsilon && fabs(v0[2]-v1[2])<epsilon )
00110 return false;
00111
00112
00113 if(v0[0]<v1[0])
00114 return true;
00115 else if ( !(v1[0]<v0[0]) && v0[1]<v1[1] )
00116 return true;
00117 else if ( !(v1[0]<v0[0]) && !(v1[1]<v0[1]) && v0[2]<v1[2] )
00118 return true;
00119
00120
00121 return false;
00122 }
00123 };
00124
00125 #endif