Ejemplo n.º 1
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="edgeSet"></param>
 /// <param name="x"></param>
 /// <param name="insertEvent"></param>
 /// <param name="obj"></param>
 public SweepLineEvent(object edgeSet, double x, SweepLineEvent insertEvent, object obj)
 {
     this.edgeSet = edgeSet;
     xValue = x;
     this.insertEvent = insertEvent;
     this.eventType = Insert;
     if (insertEvent != null)
         eventType = Delete;
     this.obj = obj;
 }
        /// <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)
        {
            MonotoneChain mc0 = (MonotoneChain)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++ ) 
            {
                SweepLineEvent ev1 = (SweepLineEvent)events[i]; 
                if (ev1.IsInsert) 
                {
                    MonotoneChain mc1 = (MonotoneChain)ev1.Object;
                    // don't compare edges in same group
                    // null group indicates that edges should be compared
                    if(ev0.EdgeSet == null)
                    {
                        // This null situation is problematic
                    }
                    if (ev0.EdgeSet == null || (ev0.EdgeSet != ev1.EdgeSet)) 
                    {
                        mc0.ComputeIntersections(mc1, si);
                        nOverlaps++;
                    }
                }
            }
        }
 /// <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)
 {
     SweepLineSegment 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++ ) 
     {
         SweepLineEvent ev1 = (SweepLineEvent)_events[i];
         if (ev1.IsInsert) 
         {
             SweepLineSegment ss1 = (SweepLineSegment)ev1.Object;
             if (ev0.EdgeSet == null || (ev0.EdgeSet != ev1.EdgeSet)) 
             ss0.ComputeIntersections(ss1, si);
             _nOverlaps++;                
         }
     }
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="edge"></param>
 /// <param name="edgeSet"></param>
 private void Add(Edge edge, object edgeSet)
 {
     MonotoneChainEdge mce = edge.MonotoneChainEdge;
     int[] startIndex = mce.StartIndexes;
     for (int i = 0; i < startIndex.Length - 1; i++) 
     {
         MonotoneChain mc = new MonotoneChain(mce, i);
         SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, mce.GetMinX(i), null, mc);
         events.Add(insertEvent);
         events.Add(new SweepLineEvent(edgeSet, mce.GetMaxX(i), insertEvent, mc));
     }
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="edge"></param>
 /// <param name="edgeSet"></param>
 private void Add(Edge edge, object edgeSet)
 {
     IList<Coordinate> pts = edge.Coordinates;
     for (int i = 0; i < pts.Count - 1; i++) 
     {
         SweepLineSegment ss = new SweepLineSegment(edge, i);
         SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, ss.MinX, null, ss);
         _events.Add(insertEvent);
         _events.Add(new SweepLineEvent(edgeSet, ss.MaxX, insertEvent, ss));
     }
 }