|
@@ -64,8 +64,14 @@ inline double GetArea2D(const T& v1, const T& v2, const T& v3) {
|
|
|
* The function accepts an unconstrained template parameter for use with
|
|
|
* both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/
|
|
|
template <typename T>
|
|
|
-inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
|
|
- return GetArea2D(p0,p2,p1) > 0;
|
|
|
+inline int OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
|
|
+ double area = GetArea2D(p0,p2,p1);
|
|
|
+ if(std::abs(area) < ai_epsilon)
|
|
|
+ return 0;
|
|
|
+ else if(area > 0)
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------------------------------
|
|
@@ -75,7 +81,10 @@ inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
|
|
template <typename T>
|
|
|
inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) {
|
|
|
// pp should be left side of the three triangle side, by ccw arrow
|
|
|
- return OnLeftSideOfLine2D(p0, p1, pp) && OnLeftSideOfLine2D(p1, p2, pp) && OnLeftSideOfLine2D(p2, p0, pp);
|
|
|
+ int c1 = OnLeftSideOfLine2D(p0, p1, pp);
|
|
|
+ int c2 = OnLeftSideOfLine2D(p1, p2, pp);
|
|
|
+ int c3 = OnLeftSideOfLine2D(p2, p0, pp);
|
|
|
+ return (c1 >= 0) && (c2 >= 0) && (c3 >= 0);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -110,7 +119,7 @@ inline bool IsCCW(T* in, size_t npoints) {
|
|
|
c = std::sqrt(cc);
|
|
|
theta = std::acos((bb + cc - aa) / (2 * b * c));
|
|
|
|
|
|
- if (OnLeftSideOfLine2D(in[i],in[i+2],in[i+1])) {
|
|
|
+ if (OnLeftSideOfLine2D(in[i],in[i+2],in[i+1]) == 1) {
|
|
|
// if (convex(in[i].x, in[i].y,
|
|
|
// in[i+1].x, in[i+1].y,
|
|
|
// in[i+2].x, in[i+2].y)) {
|
|
@@ -140,7 +149,7 @@ inline bool IsCCW(T* in, size_t npoints) {
|
|
|
//if (convex(in[npoints-2].x, in[npoints-2].y,
|
|
|
// in[0].x, in[0].y,
|
|
|
// in[1].x, in[1].y)) {
|
|
|
- if (OnLeftSideOfLine2D(in[npoints-2],in[1],in[0])) {
|
|
|
+ if (OnLeftSideOfLine2D(in[npoints-2],in[1],in[0]) == 1) {
|
|
|
convex_turn = AI_MATH_PI_F - theta;
|
|
|
convex_sum += convex_turn;
|
|
|
} else {
|