예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        //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)));
        }