Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="ev0"></param>
        /// <param name="si"></param>
        private void ProcessOverlaps(int start, int end, SweepLineEvent ev0, SegmentIntersector si)
        {
            var ss0 = (SweepLineSegment)ev0.Object;

            /*
             * Since we might need to test for self-intersections,
             * include current INSERT event object in list of event objects to test.
             * Last index can be skipped, because it must be a Delete event.
             */
            for (int i = start; i < end; i++)
            {
                var ev1 = _events[i];
                if (ev1.IsInsert)
                {
                    var ss1 = (SweepLineSegment)ev1.Object;
                    // don't compare edges in same group, if labels are present
                    if (!ev0.IsSameLabel(ev1))
                    {
                        {
                            ss0.ComputeIntersections(ss1, si);
                            _nOverlaps++;
                        }
                    }
                }
            }
        }
Exemple #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="edge"></param>
        /// <param name="edgeSet"></param>
        private void Add(Edge edge, object edgeSet)
        {
            var pts = edge.Coordinates;

            for (int i = 0; i < pts.Length - 1; i++)
            {
                var ss          = new SweepLineSegment(edge, i);
                var insertEvent = new SweepLineEvent(edgeSet, ss.MinX, null);
                _events.Add(insertEvent);
                _events.Add(new SweepLineEvent(ss.MaxX, insertEvent));
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="edge"></param>
        /// <param name="edgeSet"></param>
        private void AddEdge(Edge edge, object edgeSet)
        {
            var mce = edge.MonotoneChainEdge;

            int[] startIndex = mce.StartIndexes;
            for (int i = 0; i < startIndex.Length - 1; i++)
            {
                var mc          = new MonotoneChain(mce, i);
                var insertEvent = new SweepLineEvent(edgeSet, mce.GetMinX(i), mc);
                _events.Add(insertEvent);
                _events.Add(new SweepLineEvent(mce.GetMaxX(i), insertEvent));
            }
        }
Exemple #4
0
 /// <summary>
 /// Creates a DELETE event.
 /// </summary>
 /// <param name="x">The event location</param>
 /// <param name="insertEvent">The corresponding INSERT event</param>
 public SweepLineEvent(double x, SweepLineEvent insertEvent)
 {
     _eventType   = Delete;
     _xValue      = x;
     _insertEvent = insertEvent;
 }