00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOMETRY2D_H
00020 #define GEOMETRY2D_H
00021
00022
00023 #include <rtc/rtcVec2.h>
00024
00025 namespace rtc {
00026
00027 float dist(const Vec2f &a, const Vec2f &b);
00028
00029 float dist2(const Vec2f &a, const Vec2f &b);
00030
00031 void dist_to_line(const Vec2f &x, const Vec2f &a, const Vec2f &b, float &d, Vec2f &cp);
00032
00033 float dist_to_line(const Vec2f &x, const Vec2f &a, const Vec2f &b);
00034
00035 float proj_dist_to_line(const Vec2f &x, const Vec2f &a, const Vec2f &b);
00036
00037
00038
00039 bool closer_on_line(const Vec2f &x, const Vec2f &a, const Vec2f &b, float &d2, Vec2f &cp);
00040
00041
00042 bool circle_within_bounds(const Vec2f &b, float r, const Vec2f &bc, float br);
00043
00044
00045 bool circle_within_bounds(const Vec2f &b, float r, const Vec2f &min, const Vec2f &max);
00046
00047
00048 bool bounds_overlap_circle(const Vec2f &b, float r, const Vec2f &bc, float br);
00049
00050 long bevel_1d(const Vec2f &p);
00051
00052 long bevel_2d(const Vec2f &p);
00053
00054 Vec2f lerp(float t, const Vec2f &a, const Vec2f &b);
00055
00056
00057
00058 bool point_on_edge(const Vec2f &p1, const Vec2f &p2, float alpha, long mask);
00059
00060
00061
00062
00063 bool segment_on_edge(const Vec2f &p1, const Vec2f &p2, long outcode_diff);
00064
00065
00066
00067 bool line_outside_of_rect(const Vec2f &c, float s, const Vec2f &t1, const Vec2f &t2);
00068
00069
00070
00071 bool point_outside_of_rect(const Vec2f &c, float s, const Vec2f &p);
00072
00073
00074
00075
00076 bool point_outside_of_rect(const Vec2f &c, float xlen, float ylen, float rot_angle, const Vec2f &p);
00077
00078
00079
00080
00081
00082 bool rect_rect_X(const Vec2f &c1, float theta1, float w1, float l1,
00083 const Vec2f &c2, float theta2, float w2, float l2);
00084
00085
00086
00087
00088
00089
00090 bool line_rect_X(const Vec2f &t1, const Vec2f &t2,
00091 const Vec2f &c, float theta, float w, float l);
00092
00093
00094 template <class T> inline void rtc_bary(const Vec2<T>& p, const Vec2<T>& t1, const Vec2<T>& t2, const Vec2<T>& t3, T &b1, T &b2, T &b3)
00095 {
00096 const T v10 = t1[0]-t3[0];
00097 const T v11 = t1[1]-t3[1];
00098 const T v20 = t2[0]-t3[0];
00099 const T v21 = t2[1]-t3[1];
00100
00101 const T d = T(1.0) / (v10*v21-v11*v20);
00102 const T x0 = (p[0]-t3[0]);
00103 const T x1 = (p[1]-t3[1]);
00104 b1 = (x0*v21 - x1*v20) * d;
00105 b2 = (v10*x1 - v11*x0) * d;
00106 b3 = T(1.0) - b1 - b2;
00107 }
00108
00109
00110 template <class T> inline bool rtc_point_inside_triangle(const Vec2<T> &p, const Vec2<T>& t1, const Vec2<T>& t2, const Vec2<T>& t3)
00111 {
00112 T b1,b2,b3;
00113
00114 rtc_bary(p, t1, t2, t3, b1, b2, b3);
00115
00116 if (b1 >= T(0) && b2 >= T(0) && b3 >= T(0))
00117 return true;
00118 else
00119 return false;
00120 }
00121
00122
00123 template <class T> inline T rtc_distance_point_to_point(const Vec2<T> &a, const Vec2<T> &b)
00124 {
00125 return (a-b).norm();
00126 }
00127
00128
00129 template <class T> inline T rtc_distance_point_to_line(const Vec2<T> &x, const Vec2<T> &a, const Vec2<T> &b)
00130 {
00131 Vec2<T> ba(b[0]-a[0], b[1]-a[1]);
00132 Vec2<T> xa(x[0]-a[0], x[1]-a[1]);
00133
00134 T xa_ba = xa.dot(ba);
00135
00136 if (xa_ba < 0.0) {
00137 return rtc_distance_point_to_point(x,a);
00138 }
00139
00140
00141
00142 T fact = xa_ba/ba.normSqr();
00143 if (fact >= 1.0) {
00144 return rtc_distance_point_to_point(x,b);
00145 }
00146
00147
00148
00149 return rtc_sqrt(xa.normSqr() - xa_ba*fact);
00150 }
00151
00152
00153 template <class T> inline T rtc_distance_point_to_line_projected(const Vec2<T> &x, const Vec2<T> &a, const Vec2<T> &b)
00154 {
00155 Vec2<T> v(b[1]-a[1], a[0]-b[0]);
00156 v.normalize();
00157 Vec2<T> xa(x[0]-a[0], x[1]-a[1]);
00158 return rtc_abs(v.dot(xa));
00159 }
00160
00161
00162 template <class T> inline T rtc_triangle_area(const Vec2<T>& t1, const Vec2<T>& t2, const Vec2<T>& t3)
00163 {
00164 return rtc_abs(rtc_triangle_area_signed(t1,t2,t3));
00165 }
00166
00167
00168 template <class T> inline T rtc_triangle_area_signed(const Vec2<T>& t1, const Vec2<T>& t2, const Vec2<T>& t3)
00169 {
00170 const T a = (t2(0)-t1(0))*(t3(1)-t1(1))-(t3(0)-t1(0))*(t2(1)-t1(1));
00171 return T(0.5)*a;
00172 }
00173
00174
00175 }
00176
00177 #endif