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); }
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); }
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; }
public bool Intersect(LineSegment l, out Vector2 pts, out Vector2 K) { return(l.Intersect(this, out pts, out K)); }