示例#1
0
        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);
        }
示例#2
0
        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);
        }