Added point_in_triangle function.
This commit is contained in:
parent
9ac3c1a394
commit
b91d4411b5
@ -375,6 +375,29 @@ interpolate(T tau, const SGVec2<T>& v1, const SGVec2<T>& v2)
|
||||
return r;
|
||||
}
|
||||
|
||||
// Is the first point inside the triangle formed by the other three points?
|
||||
// Helper function
|
||||
template <typename T>
|
||||
inline
|
||||
T
|
||||
pt_determine(const SGVec2<T>& pt1, const SGVec2<T>& pt2, const SGVec2<T>& pt3)
|
||||
{
|
||||
return (pt1.x()-pt3.x()) * (pt2.y()-pt3.y()) - (pt2.x() - pt3.x()) * (pt1.y() - pt3.y());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline
|
||||
bool
|
||||
point_in_triangle(const SGVec2<T>& testpt, const SGVec2<T>& pt1, const SGVec2<T>& pt2, const SGVec2<T>& pt3)
|
||||
{
|
||||
T d1 = pt_determine(testpt,pt1,pt2);
|
||||
T d2 = pt_determine(testpt,pt2,pt3);
|
||||
T d3 = pt_determine(testpt,pt3,pt1);
|
||||
bool has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0);
|
||||
bool has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0);
|
||||
return !(has_neg && has_pos);
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
template<typename T>
|
||||
inline
|
||||
|
Loading…
Reference in New Issue
Block a user