public bool IsPointInside(clsPoint p1) { //Uses the "winding number" to check if a point lies inside or outside the sketch int i; double a; double a1; clsLine l1; clsLine l2; a = 0; l1 = new clsLine(p1, Point(0)); for (i = 1; i <= myPoints.Count - 1; i++) { l2 = new clsLine(p1, Point(i)); a1 = mdlGeometry.Angle(l1, l2); a = a + a1; l1 = l2.Copy(); } l2 = new clsLine(p1, Point(0)); a1 = mdlGeometry.Angle(l1, l2); a = a + a1; if (mdlGeometry.IsSameDbl(a, 0)) { return(false); } return(true); }
public bool Overlaps(clsLine aLine, double aTol = 0) { clsLine l1 = default(clsLine); clsPoint p3 = default(clsPoint); clsPoint p4 = default(clsPoint); if (aTol == 0) { aTol = mdlGeometry.myTol; } l1 = aLine.Copy(); if ((!IsOnLine(l1.P1, aTol)) | (!IsOnLine(l1.P2, aTol))) { return(false); } if (Dot(l1) < 0) { l1.Reverse(); } p3 = l1.P1; p4 = l1.P2; if (P1 == p3) { return(true); } if (P1 == p4 | P2 == p3) { return(false); } if (IsOnShortLine(p4, aTol)) { return(true); } if (l1.IsOnShortLine(P1, aTol) | l1.IsOnShortLine(P2, aTol)) { return(true); } return(false); }
//Public Function IntersectShortLine1(ByVal l1 As clsLine) As clsPoint 'Leaves Me as infinite, but truncates l1 // Dim lambda As Double // If Abs((l1.X2 - l1.X1) * (Y1 - Y2) + (l1.Y2 - l1.Y1) * (X2 - X1)) < mdlGeometry.myTol Then Return Nothing 'No intersection // lambda = ((X2 - l1.X1) * (Y1 - Y2) + (Y2 - l1.Y1) * (X2 - X1)) / ((l1.X2 - l1.X1) * (Y1 - Y2) + (l1.Y2 - l1.Y1) * (X2 - X1)) // If lambda < 0 Or lambda > 1 Then Return Nothing // Return New clsPoint(l1.X1 + lambda * (l1.X2 - l1.X1), l1.Y1 + lambda * (l1.Y2 - l1.Y1)) //End Function //Public Function IntersectShortLine2(ByVal l1 As clsLine) As clsPoint 'Truncates Me but leaves l1 infinite // Dim lambda As Double // If Abs((X2 - X1) * (l1.Y1 - l1.Y2) + (Y2 - Y1) * (l1.X2 - l1.X1)) < mdlGeometry.myTol Then Return Nothing 'No intersection // lambda = ((l1.X2 - X1) * (l1.Y1 - l1.Y2) + (l1.Y2 - Y1) * (l1.X2 - l1.X1)) / ((X2 - X1) * (l1.Y1 - l1.Y2) + (Y2 - Y1) * (l1.X2 - l1.X1)) // If lambda < 0 Or lambda > 1 Then Return Nothing // Return New clsPoint(X1 + lambda * (X2 - X1), Y1 + lambda * (Y2 - Y1)) //End Function public clsPoint Intersect(clsLine l1) { //Both infinite. More accurate that IntersectQuick double l = 0; clsLine l2 = default(clsLine); clsLine l3 = default(clsLine); if (Length < mdlGeometry.myTol | l1.Length < mdlGeometry.myTol) { return(null); } l2 = Copy(); l3 = l1.Copy(); l2.Length = 1000; l3.Length = 1000; if (Abs(((l2.X2 - l2.X1) * (l3.Y1 - l3.Y2) + (l2.Y2 - l2.Y1) * (l3.X2 - l3.X1))) < mdlGeometry.myTol / 10) { return(null); } //No intersection l = ((l3.X2 - l2.X1) * (l3.Y1 - l3.Y2) + (l3.Y2 - l2.Y1) * (l3.X2 - l3.X1)) / ((l2.X2 - l2.X1) * (l3.Y1 - l3.Y2) + (l2.Y2 - l2.Y1) * (l3.X2 - l3.X1)); return(new clsPoint(l2.X1 + l * (l2.X2 - l2.X1), l2.Y1 + l * (l2.Y2 - l2.Y1))); }