Beispiel #1
0
        public void Add(SweepLineInterval sweepInt)
        {
            SweepLineEvent insertEvent = new SweepLineEvent(sweepInt.Min, null, sweepInt);

            events.Add(insertEvent);

            events.Add(new SweepLineEvent(sweepInt.Max, insertEvent, sweepInt));
        }
Beispiel #2
0
 public SweepLineEvent(double x, SweepLineEvent insertEvent, SweepLineInterval sweepInt)
 {
     this.xValue      = x;
     this.insertEvent = insertEvent;
     this.eventType   = SweepLineEventType.INSERT;
     if (insertEvent != null)
     {
         this.eventType = SweepLineEventType.DELETE;
     }
     this.sweepInt = sweepInt;
 }
Beispiel #3
0
        public void ComputeOverlaps(ISweepLineOverlapAction action)
        {
            nOverlaps = 0;
            BuildIndex();

            for (int i = 0; i < events.Count; i++)
            {
                SweepLineEvent ev = (SweepLineEvent)events[i];
                if (ev.IsInsert)
                {
                    ProcessOverlaps(i, ev.DeleteEventIndex, ev.Interval, action);
                }
            }
        }
Beispiel #4
0
        /// <summary> Because Delete Events have a link to their corresponding Insert event,
        /// it is possible to compute exactly the range of events which must be
        /// compared to a given Insert event object.
        /// </summary>
        private void BuildIndex()
        {
            if (indexBuilt)
            {
                return;
            }

            events.Sort();
            for (int i = 0; i < events.Count; i++)
            {
                SweepLineEvent ev = (SweepLineEvent)events[i];
                if (ev.IsDelete)
                {
                    ev.InsertEvent.DeleteEventIndex = i;
                }
            }
            indexBuilt = true;
        }
Beispiel #5
0
 private void ProcessOverlaps(int start, int end,
                              SweepLineInterval s0, ISweepLineOverlapAction action)
 {
     /// <summary> 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.
     /// </summary>
     for (int i = start; i < end; i++)
     {
         SweepLineEvent ev = (SweepLineEvent)events[i];
         if (ev.IsInsert)
         {
             SweepLineInterval s1 = ev.Interval;
             action.Overlap(s0, s1);
             nOverlaps++;
         }
     }
 }
Beispiel #6
0
 /// <summary>
 /// ProjectionEvents are ordered first by their x-value, and then by their eventType.
 /// It is important that Insert events are sorted before Delete events, so that
 /// items whose Insert and Delete events occur at the same x-value will be
 /// correctly handled.
 /// </summary>
 public int CompareTo(SweepLineEvent pe)
 {
     if (xValue < pe.xValue)
     {
         return(-1);
     }
     if (xValue > pe.xValue)
     {
         return(1);
     }
     if (eventType < pe.eventType)
     {
         return(-1);
     }
     if (eventType > pe.eventType)
     {
         return(1);
     }
     return(0);
 }