コード例 #1
0
        private bool TryFormTriangle(Segment shortestSegment, Point p, bool existingPoint)
        {
            Segment newSegment1 = new Segment(shortestSegment.Start, p);
            Segment newSegment2 = new Segment(p, shortestSegment.End);

            List<Segment> SegmentsToAdd = new List<Segment>();
            List<Segment> SegmentsToRemove = new List<Segment>();

            // Check if triangle can be formed
            if (this.Front.Contains(newSegment1, cellDistance))
            {
                SegmentsToRemove.Add(newSegment1);
            }
            else
            {
                // Test if triangle candidate intersects with existing elements
                if (IsIntersecting(newSegment1)) return false;

                // Test if segment is outside of the front
                if (!this.Front.IsPointInside(newSegment1.GetPoint(0.5))) return false;

                SegmentsToAdd.Add(newSegment1);
            }

            if (this.Front.Contains(newSegment2, cellDistance))
            {
                SegmentsToRemove.Add(newSegment2);
            }
            else
            {
                // Test if triangle candidate intersects with existing elements
                if (IsIntersecting(newSegment2)) return false;

                // Test if segment is outside of the front
                if (!this.Front.IsPointInside(newSegment2.GetPoint(0.5))) return false;

                SegmentsToAdd.Add(newSegment2);
            }

            // update front and form triangle

            // Remove current segment from the front.
            this.Front.RemoveSegment(shortestSegment);

            // Update front with new segments.
            if (!existingPoint)
            {
                this.Points.Add(p);
                this.Front.Points.Add(p);
            }
            foreach (Segment s in SegmentsToAdd)
            {
                this.Front.AddSegment(s);
            }
            foreach (Segment s in SegmentsToRemove)
            {
                this.Front.RemoveSegment(s);
            }

            AddTriangle(shortestSegment.Start, shortestSegment.End, p);

            return true;
        }