00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOMETRY3D_H
00020 #define GEOMETRY3D_H
00021
00022
00023 #include <rtc/rtcVec3.h>
00024
00025 namespace rtc {
00026
00027
00028 float dot(const Vec3f &a, const Vec3f &b);
00029
00030 Vec3f cross(const Vec3f &a, const Vec3f &b);
00031
00032 Vec3f cross(const Vec3f &a, const Vec3f &b, const Vec3f &c);
00033 float dist2(const Vec3f &a, const Vec3f &b);
00034 float dist(const Vec3f &a, const Vec3f &b);
00035
00036 Vec3f lerp(float t, const Vec3f &a, const Vec3f &b);
00037
00038 bool point_within_bounds(const Vec3f &c, const Vec3f &bc, float br);
00039
00040
00041 bool ball_within_bounds(const Vec3f &b, float r,
00042 const Vec3f &bc, float br);
00043
00044
00045 bool ball_within_bounds(const Vec3f &b, float r,
00046 const Vec3f &min,
00047 const Vec3f &max);
00048
00049
00050 bool bounds_overlap_ball(const Vec3f &b, float r,
00051 const Vec3f &bc, float br);
00052 bool bounds_overlap_ball(const Vec3f &b, float r,
00053 const Vec3f &min, const Vec3f &max);
00054
00055
00056
00057
00058 void bary_fast(const Vec3f& p, const Vec3f& n,
00059 const Vec3f &t0, const Vec3f& v1,
00060 const Vec3f& v2, float &b1, float &b2, float &b3);
00061 bool closer_on_lineseg(const Vec3f &x, Vec3f &cp, const Vec3f &a,
00062 const Vec3f &b, float &d2);
00063 void distance_point_line(const Vec3f &x, const Vec3f &a,
00064 const Vec3f &b, float &d2, Vec3f &cp);
00065 void distance_point_tri(const Vec3f &x, const Vec3f &t1,
00066 const Vec3f &t2, const Vec3f &t3,
00067 float &d2, Vec3f &cp);
00068 bool closer_on_tri(const Vec3f &x, Vec3f &cp,
00069 const Vec3f &t1, const Vec3f &t2,
00070 const Vec3f &t3, float &d2);
00071
00072
00073
00074 bool line_plane_X(const Vec3f& p, const Vec3f& dir,
00075 const Vec3f& t1, const Vec3f& t2,
00076 const Vec3f& t3,
00077 Vec3f &x, float &dist);
00078 bool line_plane_X(const Vec3f& p, const Vec3f& dir,
00079 const Vec3f& nrm, float d, Vec3f &x, float &dist);
00080
00081
00082 void bary(const Vec3f& p,
00083 const Vec3f& t1, const Vec3f& t2, const Vec3f& t3,
00084 float &b1, float &b2, float &b3);
00085
00086
00087
00088 bool bary(const Vec3f& p, const Vec3f& dir,
00089 const Vec3f& t1, const Vec3f& t2, const Vec3f& t3,
00090 float &b1, float &b2, float &b3);
00091
00092
00093 bool line_tri_X(const Vec3f& p, const Vec3f& dir,
00094 const Vec3f& t1, const Vec3f& t2, const Vec3f& t3,
00095 Vec3f& x, float& d);
00096
00097 bool closer_on_line(const Vec3f &x, const Vec3f &a, const Vec3f &b, float &d2, Vec3f &cp);
00098 void dist_to_line(const Vec3f &x, const Vec3f &a, const Vec3f &b, float &d, Vec3f &cp);
00099 float dist_to_line(const Vec3f &x, const Vec3f &a, const Vec3f &b);
00100
00101
00102 template <class T> inline T rtc_triangle_area(const Vec3<T>& t1, const Vec3<T>& t2, const Vec3<T>& t3)
00103 {
00104 const Vec3<T> v1 = t2-t1;
00105 const Vec3<T> v2 = t3-t1;
00106 const Vec3<T> t = v1.cross(v2);
00107 return T(0.5)*t.norm();
00108 }
00109
00110
00111 }
00112
00113 #endif