Пример #1
0
        public bool Intersect(Circle c, out Vector2[] pts)
        {
            // iterate through the points and find all intersections
            Vector2[]      pt_temp;
            List <Vector2> pt_list = new List <Vector2>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                LineSegment ls = new LineSegment(points[i], points[i + 1]);
                if (ls.Intersect(c, out pt_temp))
                {
                    pt_list.AddRange(pt_temp);
                }
            }

            LineSegment ls1 = new LineSegment(points[0], points[points.Count - 1]);

            if (ls1.Intersect(c, out pt_temp))
            {
                pt_list.AddRange(pt_temp);
            }

            pts = pt_list.ToArray();
            return(pts.Length > 0);
        }
Пример #2
0
        public bool Intersect(Line l, out Vector2[] pts, out double[] K)
        {
            // go through and label each point on the "left" or "right" of the line
            bool[]  pt_side = new bool[points.Count];
            Vector2 s       = l.P1 - l.P0;

            for (int i = 0; i < points.Count; i++)
            {
                Vector2 t = points[i] - l.P0;
                pt_side[i] = s.Cross(t) < 0;
            }

            // figure out any pairs spanning the line
            List <Vector2> pt_list = new List <Vector2>();
            List <double>  K_list  = new List <double>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                if (pt_side[i] != pt_side[i + 1])
                {
                    // this is a cross, check for intersection
                    LineSegment ls = new LineSegment(points[i], points[i + 1]);
                    Vector2     pt_temp, K_temp;
                    if (ls.Intersect(l, out pt_temp, out K_temp))
                    {
                        pt_list.Add(pt_temp);
                        K_list.Add(K_temp.Y);
                    }
                }
            }

            // check the start/end pair
            if (pt_side[0] != pt_side[pt_side.Length - 1])
            {
                LineSegment ls = new LineSegment(points[0], points[points.Count - 1]);
                Vector2     pt_temp, K_temp;
                if (ls.Intersect(l, out pt_temp, out K_temp))
                {
                    pt_list.Add(pt_temp);
                    K_list.Add(K_temp.Y);
                }
            }

            pts = pt_list.ToArray();
            K   = K_list.ToArray();

            return(pts.Length > 0);
        }
Пример #3
0
        private bool DoSegmentsCollide(IPathSegment seg1, IPathSegment seg2, out double collideDist1, out double collideDist2)
        {
            bool doesIntersect = false;
            Vector2 intersectPoint;
            Vector2[] p = new Vector2[4];

            collideDist1 = Double.MaxValue;
            collideDist2 = Double.MaxValue;

            LineSegment ls1 = new LineSegment(seg1.Start, seg1.End);
            LineSegment ls2 = new LineSegment(seg2.Start, seg2.End);

            doesIntersect = ls1.Intersect(ls2, out intersectPoint);

            p[0] = ls1.ClosestPoint(seg2.Start);
            p[1] = ls1.ClosestPoint(seg2.End);
            p[2] = ls2.ClosestPoint(seg1.Start);
            p[3] = ls2.ClosestPoint(seg1.End);

            if (doesIntersect)
            {
                collideDist1 = seg1.Start.DistanceTo(intersectPoint);
                collideDist2 = seg2.Start.DistanceTo(intersectPoint);
            }

            if ((p[0] - seg2.Start).Length < collideThreshold)
            {
                if (collideDist1 > seg1.Start.DistanceTo(p[0]))
                {
                    collideDist1 = seg1.Start.DistanceTo(p[0]);
                    collideDist2 = 0;
                    doesIntersect = true;
                }
            }

            if ((p[1] - seg2.End).Length < collideThreshold)
            {
                if (collideDist1 > seg1.Start.DistanceTo(p[1]))
                {
                    collideDist1 = seg1.Start.DistanceTo(p[1]);
                    collideDist2 = seg2.Length;
                    doesIntersect = true;
                }
            }

            if ((p[2] - seg1.Start).Length < collideThreshold)
            {
                collideDist1 = 0;
                collideDist2 = seg2.Start.DistanceTo(p[2]);
            }

            if ((p[3] - seg1.End).Length < collideThreshold)
            {
                if (collideDist1 > seg1.Length)
                {
                    collideDist1 = seg1.Length;
                    collideDist2 = seg2.Start.DistanceTo(p[3]);
                }
            }

            return doesIntersect;
        }
Пример #4
0
 public bool Intersect(LineSegment l, out Vector2 pts, out Vector2 K)
 {
     return(l.Intersect(this, out pts, out K));
 }