private void Check(SegmentEvent e, SegmentEvent ev)
 {
     Segment.Vector v;
     if (e.nid0 != ev.nid0 && e.nid0 != ev.nid1 && e.nid1 != ev.nid0 && e.nid1 != ev.nid1)
     {
         if (ev.s0.upperEnd.y > e.s0.lowerEnd.y && e.s0.upperEnd.y > ev.s0.lowerEnd.y)
         {
             if (e.s0.HasIntersection(ev.s0, out v))
             {
                 SegmentEvent isEv = new SegmentEvent(SegmentEvent.type.Intersection, v, e.s0, ev.s0);
                 isEv.nid0  = e.nid0;
                 isEv.nid1  = e.nid1;
                 isEv.nnid0 = ev.nid0;
                 isEv.nnid1 = ev.nid1;
                 intersections.Add(isEv);
             }
         }
     }
 }
        private void AddEvent(SegmentEvent ev)
        {
            double X = ev.coordinate.x;

            X = Math.Floor(X * 10);
            X = Math.Floor(X);
            double Y = ev.coordinate.y;

            Y = Math.Floor(Y * 10);
            Y = Math.Floor(Y);
            if (!events.ContainsKey(Y))
            {
                SortedDictionary <double, List <SegmentEvent> > dict =
                    new SortedDictionary <double, List <SegmentEvent> >();
                events.Add(Y, dict);
            }
            if (!events[Y].ContainsKey(X))
            {
                List <SegmentEvent> list = new List <SegmentEvent>();
                events[Y].Add(X, list);
            }
            events[Y][X].Add(ev);
        }
        private void CreateEventsFromEdges(Node n, Node.weightedEdge e)
        {
            if (!n.inside)
            {
                return;
            }
            Segment.Vector v0 = new Segment.Vector();
            v0.x = n.coordinates.position.longitude;
            v0.y = n.coordinates.position.latitude;
            Segment.Vector v1 = new Segment.Vector();
            v1.x = e.neighbour.coordinates.position.longitude;
            v1.y = e.neighbour.coordinates.position.latitude;
            Segment      s          = new Segment(v0, v1);
            SegmentEvent eventStart = new SegmentEvent(SegmentEvent.type.Start, s.upperEnd, s);

            eventStart.nid0 = n.id;
            eventStart.nid1 = e.neighbour.id;
            if (eventStart.nid0 == eventStart.nid1)
            {
                return;
            }
            AddEvent(eventStart);
        }
        private void CheckAllIntersections(SegmentEvent e)
        {
            double X = e.coordinate.x;

            X = Math.Floor(X * 10);
            X = Math.Floor(X);
            double Y = e.coordinate.y;

            Y = Math.Floor(Y * 10);
            Y = Math.Floor(Y);
            foreach (SegmentEvent ev in events[Y][X])
            {
                Check(e, ev);
            }
            Y = Y - 1;
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X))
            {
                foreach (SegmentEvent ev in events[Y][X])
                {
                    Check(e, ev);
                }
            }

            if (events.ContainsKey(Y) && events[Y].ContainsKey(X - 1))
            {
                foreach (SegmentEvent ev in events[Y][X - 1])
                {
                    Check(e, ev);
                }
            }
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X + 1))
            {
                foreach (SegmentEvent ev in events[Y][X + 1])
                {
                    Check(e, ev);
                }
            }
            Y = Y + 1;
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X - 1))
            {
                foreach (SegmentEvent ev in events[Y][X - 1])
                {
                    Check(e, ev);
                }
            }
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X + 1))
            {
                foreach (SegmentEvent ev in events[Y][X + 1])
                {
                    Check(e, ev);
                }
            }
            Y = Y + 1;
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X))
            {
                foreach (SegmentEvent ev in events[Y][X])
                {
                    Check(e, ev);
                }
            }

            if (events.ContainsKey(Y) && events[Y].ContainsKey(X - 1))
            {
                foreach (SegmentEvent ev in events[Y][X - 1])
                {
                    Check(e, ev);
                }
            }
            if (events.ContainsKey(Y) && events[Y].ContainsKey(X + 1))
            {
                foreach (SegmentEvent ev in events[Y][X + 1])
                {
                    Check(e, ev);
                }
            }
        }