public List <Vector3> Intersections(LinePath other) { var epsilon = (0.9f * 0.9f) / 0.5f; //finds intersections between this linepath and another. var result = new List <Vector3>(); float soFar = 0; for (int i = 0; i < Segments.Count; i++) { var seg1 = Segments[i]; for (int j = 0; j < other.Segments.Count; j++) { var seg2 = other.Segments[j]; var inter = seg1.Intersect(seg2); if (inter != null) { var interc = inter.Value; interc.Z += soFar; result.Add(interc); } } soFar += seg1.Length; } //remove dupes result = result.OrderBy(x => x.Z).ToList(); for (int i = 0; i < result.Count - 1; i++) { var first = result[i]; while (i < result.Count - 1) { var second = result[i + 1]; var distance = second - first; distance.Z = 0; if (distance.LengthSquared() < epsilon) { result.RemoveAt(i); } else { ; } { break; } } } return(result); }
public List <LinePath> Split(float dist, float gap) { var result = new List <LinePath>(); var startGap = dist - gap / 2; var endGap = dist + gap / 2; bool before = 0 < startGap; LinePath current = new LinePath(); if (before) { current.SharpStart = SharpStart; current.SharpEnd = true; current.StartOffset = StartOffset; } else { current.SharpStart = true; current.SharpEnd = SharpEnd; current.StartOffset = StartOffset + endGap; } current.TemplateNum = TemplateNum; float soFar = 0; foreach (var segment in Segments) { if (before) { if (soFar + segment.Length <= startGap) { //add this segment current.Segments.Add(segment); } else { //this segment extends over the gap. //an additional segment must be added to reach the start gap if (soFar != startGap && segment.Length != 0) { var bridge = new LinePathSegment(segment.Start, Vector2.Lerp(segment.Start, segment.End, (startGap - soFar) / segment.Length)); bridge.StartNormal = segment.StartNormal; current.Segments.Add(bridge); } current.Length = current.Segments.Sum(x => x.Length); result.Add(current); current = new LinePath(); current.SharpStart = true; current.SharpEnd = SharpEnd; current.StartOffset = StartOffset + endGap; current.TemplateNum = TemplateNum; before = false; } } if (!before) { if (current.Segments.Count == 0) { //waiting to get to a segment that ends after the gap. if (soFar + segment.Length > endGap) { var bridge = new LinePathSegment(Vector2.Lerp(segment.Start, segment.End, (endGap - soFar) / segment.Length), segment.End); bridge.EndNormal = segment.EndNormal; current.Segments.Add(bridge); } } else { //add this segment current.Segments.Add(segment); } } soFar += segment.Length; } current.Length = current.Segments.Sum(x => x.Length); result.Add(current); return(result); }