di2566.txt ;************************************************************************************************** ; LISTING 1 - HIT TEST FOR TRIANGULAR REGIONS ; ; "Algorithm tests for point location," EDN, Aug 3, 2000, pg 126 ; ; http://www.ednmag.com/ednmag/reg/2000/08032000/designideas.htm#16di4 ;*************************************************************************************************** class TTriangle { public: TTriangle (TPoint &PntA, TPoint &PntB, TPoint &PntC); BOOL Contains (TPoint &PntX); double Area (void) { return area; } private: TPoint PntA, PntB, PntC; // vertices double area; } ; TTriangle::TTriangle(TPoint &pntA, TPoint &pntB, TPoint &pntC) { PntA = pntA; PntB = pntB; PntC = pntC; area = 0.5*( ((PntB.x*PntC.y) - (PntC.x*PntB.y)) -((PntA.x*PntC.y) - (PntC.x*PntA.y)) +((PntA.x*PntB.y) - (PntB.x*PntA.y))); area = fabs(area); } BOOL TTriangle::Contains (TPoint &PntX) { TTriangle ABX (PntA, PntB, PntX); TTriangle BCX (PntB, PntC, PntX); TTriangle CAX (PntC, PntA, PntX); double NewArea = ABX.Area()+BCX.Area()+CAX.Area(); if (fabs(NewArea - area) > 1e-6) return FALSE; return TRUE; } // an example void main (void) { TTriangle ABC (TPoint(1,1),TPoint(8,2), TPoint(5,9)); TPoint X(4,4); if (ABC.Contains(X)) printf ("ABC contains X\n"); else printf ("ABC does not contain X\n"); }