30 #ifndef GRALE_TRIANGLE2D_H
32 #define GRALE_TRIANGLE2D_H
34 #include "graleconfig.h"
36 #include "pointsort.h"
37 #include "Wm5IntrTriangle2Triangle2.h"
51 Triangle2D(
Vector2D<T> p[3]) { m_points[0] = p[0]; m_points[1] = p[1]; m_points[2] = p[2]; m_points[3] = p[0]; }
55 const Vector2D<T> *getPoints()
const {
return m_points; }
69 return ((T)0.5)*ABS(vec1.getX()*vec2.getY() - vec1.getY()*vec2.getX());
73 bool Triangle2D<T>::isInside(Vector2D<T> point)
const
78 for (
int i = 0 ; i < 3 ; i++)
80 Vector2D<T> v = m_points[i+1] - m_points[i];
81 Vector2D<T> w = point - m_points[i];
82 T value = v.getX()*w.getY() - v.getY()*w.getX();
93 if (posCount == 3 || negCount == 3)
99 inline T Triangle2D<T>::getOverlapArea(
const Triangle2D<T> &t)
const
101 Wm5::Triangle2<T> t1;
102 Wm5::Triangle2<T> t2;
104 Vector2D<T> A = m_points[1]-m_points[0];
105 Vector2D<T> B = m_points[2]-m_points[0];
107 if (A.getX()*B.getY() - A.getY()*B.getX() > 0)
109 t1 = Wm5::Triangle2<T>(Wm5::Vector2<T>(m_points[0].getX(), m_points[0].getY()),
110 Wm5::Vector2<T>(m_points[1].getX(), m_points[1].getY()),
111 Wm5::Vector2<T>(m_points[2].getX(), m_points[2].getY()));
115 t1 = Wm5::Triangle2<T>(Wm5::Vector2<T>(m_points[1].getX(), m_points[1].getY()),
116 Wm5::Vector2<T>(m_points[0].getX(), m_points[0].getY()),
117 Wm5::Vector2<T>(m_points[2].getX(), m_points[2].getY()));
120 A = t.m_points[1]-t.m_points[0];
121 B = t.m_points[2]-t.m_points[0];
123 if (A.getX()*B.getY() - A.getY()*B.getX() > 0)
125 t2 = Wm5::Triangle2<T>(Wm5::Vector2<T>(t.m_points[0].getX(), t.m_points[0].getY()),
126 Wm5::Vector2<T>(t.m_points[1].getX(), t.m_points[1].getY()),
127 Wm5::Vector2<T>(t.m_points[2].getX(), t.m_points[2].getY()));
131 t2 = Wm5::Triangle2<T>(Wm5::Vector2<T>(t.m_points[1].getX(), t.m_points[1].getY()),
132 Wm5::Vector2<T>(t.m_points[0].getX(), t.m_points[0].getY()),
133 Wm5::Vector2<T>(t.m_points[2].getX(), t.m_points[2].getY()));
136 Wm5::IntrTriangle2Triangle2<T> intersection(t1, t2);
150 if (!intersection.Test())
153 if (!intersection.Find())
156 int numIntersectionPoints = intersection.GetQuantity();
162 if (numIntersectionPoints < 3)
165 int num = numIntersectionPoints - 2;
167 Vector2D<T> v1(intersection.GetPoint(0).X(), intersection.GetPoint(0).Y());
169 for (
int i = 0 ; i < num ; i++)
171 Vector2D<T> v2(intersection.GetPoint(i+1).X(),intersection.GetPoint(i+1).Y());
172 Vector2D<T> v3(intersection.GetPoint(i+2).X(),intersection.GetPoint(i+2).Y());
174 Triangle2D<T> t2(v1, v2, v3);
176 totalArea += t2.getArea();
183 Vector2D<T> Triangle2D<T>::getCentroid()
const
185 return (m_points[0] + m_points[1] + m_points[2])/((T)3);
189 class Triangle2DPlus :
public Triangle2D<T>
192 Triangle2DPlus(Vector2D<T> point1, Vector2D<T> point2, Vector2D<T> point3, T height1, T height2, T height3) : Triangle2D<T>(point1, point2, point3)
194 m_heights[0] = height1;
195 m_heights[1] = height2;
196 m_heights[2] = height3;
197 m_heights[3] = height1;
198 m_diff1 = Triangle2D<T>::m_points[1] - Triangle2D<T>::m_points[0];
199 m_diff2 = Triangle2D<T>::m_points[2] - Triangle2D<T>::m_points[0];
200 m_hdiff1 = m_heights[1] - m_heights[0];
201 m_hdiff2 = m_heights[2] - m_heights[0];
202 m_denom = m_diff1.getX()*m_diff2.getY() - m_diff1.getY()*m_diff2.getX();
205 bool isInside(Vector2D<T> point, T &height)
207 if (!Triangle2D<T>::isInside(point))
210 Vector2D<T> pdiff = point - Triangle2D<T>::m_points[0];
211 T alpha = (m_diff2.getY()*pdiff.getX() - m_diff2.getX()*pdiff.getY())/m_denom;
212 T beta = (-m_diff1.getY()*pdiff.getX() + m_diff1.getX()*pdiff.getY())/m_denom;
214 height = m_heights[0] + alpha*m_hdiff1 + beta*m_hdiff2;
219 const double *getHeights()
const {
return m_heights; }
222 T m_denom, m_hdiff1, m_hdiff2;
223 Vector2D<T> m_diff1, m_diff2;
228 #endif // GRALE_TRIANGLE2D_H