Exemple #1
0
        private void FixPosition(IArc arc, CircleEvent circle)
        {
            var vertex = _vertexLists[arc].Last();

            vertex.Position = circle.Center();
            vertex.Sites    = new List <SiteEvent> {
                circle.LeftArc.Site, circle.MiddleArc.Site, circle.RightArc.Site
            };
        }
Exemple #2
0
        public void TryInsert(CircleEvent circleEvent)
        {
            TryRemoveEventCorrespondingTo(circleEvent.MiddleArc);

            if (HasThreeDistinctSites(circleEvent) &&
                WillOccurBeforeTermination(circleEvent))
            {
                IPriorityQueueHandle <CircleEvent> eventHandle = null;
                _queue.Add(ref eventHandle, circleEvent);

                _queueHandles.Add(circleEvent.MiddleArc, eventHandle);
            }
        }
Exemple #3
0
        public void CircleEvent(CircleEvent circle)
        {
            FixPosition(circle.MiddleArc, circle);
            FixPosition(circle.RightArc, circle);

            if (circle.LeftArc.LeftNeighbour == circle.RightArc.Site)
            {
                FixPosition(circle.LeftArc, circle);
            }
            else
            {
                _vertexLists[circle.RightArc].Add(new Vertex(circle.RightArc, _sweepline));
            }
        }
Exemple #4
0
 private bool WillOccurBeforeTermination(CircleEvent circleEvent)
 {
     return(circleEvent.Priority >= _terminatingPriority);
 }
Exemple #5
0
 private bool HasThreeDistinctSites(CircleEvent circleEvent)
 {
     return(circleEvent.LeftArc.Site != circleEvent.MiddleArc.Site &&
            circleEvent.MiddleArc.Site != circleEvent.RightArc.Site &&
            circleEvent.RightArc.Site != circleEvent.LeftArc.Site);
 }
Exemple #6
0
 public void Remove(CircleEvent circleEvent)
 {
     Remove(circleEvent.MiddleArc);
     Sweepline.Priority = circleEvent.Priority;
 }