aabb_2d_triangle_2d.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_AABB_2D_TRIANGLE_2D_H
00044 #define LASS_GUARDIAN_OF_INCLUSION_PRIM_AABB_2D_TRIANGLE_2D_H
00045
00046 #include "prim_common.h"
00047 #include "aabb_2d.h"
00048 #include "triangle_2d.h"
00049
00050 namespace lass
00051 {
00052 namespace prim
00053 {
00054
00055
00056
00057
00058
00059 template <typename T>
00060 Aabb2D<T> aabb(const Triangle2D<T>& triangle)
00061 {
00062 Aabb2D<T, AutoMinMax> result(triangle[0], triangle[1]);
00063 result += triangle[2];
00064 return result;
00065 }
00066
00067
00068
00069
00070
00071
00072 template <typename T, typename MMP>
00073 const bool intersects(const Triangle2D<T>& triangle, const Aabb2D<T, MMP>& box)
00074 {
00075 if (!box.intersects(aabb(triangle)))
00076 {
00077 return false;
00078 }
00079
00080 typedef typename Triangle2D<T>::TPoint TPoint;
00081 typedef typename Triangle2D<T>::TVector TVector;
00082 typedef typename Triangle2D<T>::TValue TValue;
00083 int k1 = 1, k2 = 2;
00084 for (int k0 = 0; k0 < 3; ++k0)
00085 {
00086 const TPoint& tail = triangle[k0];
00087 const TVector edge = triangle[k1] - tail;
00088 const TVector min = box.min() - tail;
00089 const TVector max = box.max() - tail;
00090
00091 const TValue t[4] = {
00092 perpDot(edge, min),
00093 perpDot(edge, max),
00094 perpDot(edge, TVector(min.x, max.y)),
00095 perpDot(edge, TVector(max.x, min.y))
00096 };
00097
00098 if (t[0] < 0 && t[1] < 0 && t[2] < 0 && t[3] < 0)
00099 {
00100 return false;
00101 }
00102
00103 const TValue tMax = perpDot(edge, triangle[k2] - tail);
00104 LASS_ASSERT(tMax >= 0);
00105 if (t[0] > tMax && t[1] > tMax && t[2] > tMax && t[3] > tMax)
00106 {
00107 return false;
00108 }
00109
00110 k1 = k2;
00111 k2 = k0;
00112 }
00113
00114 return true;
00115 }
00116
00117
00118
00119
00120
00121
00122 template <typename T, typename MMP>
00123 const bool intersects(const Aabb2D<T, MMP>& box, const Triangle2D<T>& triangle)
00124 {
00125 return intersects(triangle, box);
00126 }
00127
00128
00129
00130
00131
00132
00133 template <typename T, typename MMP>
00134 const bool collides(const Triangle2D<T>& triangle, const Aabb2D<T, MMP>& box)
00135 {
00136 if (!box.collides(aabb(triangle)))
00137 {
00138 return false;
00139 }
00140
00141 typedef typename Triangle2D<T>::TPoint TPoint;
00142 typedef typename Triangle2D<T>::TVector TVector;
00143 typedef typename Triangle2D<T>::TValue TValue;
00144 int k1 = 1, k2 = 2;
00145 for (int k0 = 0; k0 < 3; ++k0)
00146 {
00147 const TPoint& tail = triangle[k0];
00148 const TVector edge = triangle[k1] - tail;
00149 const TVector min = box.min() - tail;
00150 const TVector max = box.max() - tail;
00151
00152 const TValue t[4] = {
00153 perpDot(edge, min),
00154 perpDot(edge, max),
00155 perpDot(edge, TVector(min.x, max.y)),
00156 perpDot(edge, TVector(max.x, min.y))
00157 };
00158
00159 if (t[0] <= 0 && t[1] <= 0 && t[2] <= 0 && t[3] <= 0)
00160 {
00161 return false;
00162 }
00163
00164 const TValue tMax = perpDot(edge, triangle[k2] - tail);
00165 LASS_ASSERT(tMax >= 0);
00166 if (t[0] >= tMax && t[1] >= tMax && t[2] >= tMax && t[3] >= tMax)
00167 {
00168 return false;
00169 }
00170
00171 k1 = k2;
00172 k2 = k0;
00173 }
00174
00175 return true;
00176 }
00177
00178
00179
00180
00181
00182
00183 template <typename T, typename MMP>
00184 const bool collides(const Aabb2D<T, MMP>& box, const Triangle2D<T>& triangle)
00185 {
00186 return collides(triangle, box);
00187 }
00188
00189 }
00190 }
00191
00192 #endif
00193
00194