Exemplo n.º 1
0
 /// <summary>
 /// Первоначальная генерация Site и добавление в очередь с приоритетами событий SiteEvent-ы.
 /// </summary>
 /// <param name="nEvents"></param>
 /// <param name="xLim"></param>
 /// <param name="yLim"></param>
 private void EventGeneration(int nEvents, int xLim, int yLim)
 {
     for (int i = 0; i < nEvents; i++)
     {
         SiteEvent curEvent = new SiteEvent(new Point(rnd.Next(1, xLim), rnd.Next(1, yLim)));
         mEvents.Add(curEvent);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// Обработчик события точки.
        /// </summary>
        /// <param name="curEvent"></param>
        private void SiteEventHandler(SiteEvent curEvent)
        {
            Site curSite = curEvent.site;

            // 1) Если береговая линия пуста то просто ставим новую дугу в корень.
            if (mBeachLine.IsEmpty())
            {
                mBeachLine.SetRoot(new Arc(curSite));
                return;
            }

            // 2) Ищем дугу которую разбивает наше новое собите точки.
            Arc brokenArc = mBeachLine.FindArcAbove(curSite.basePoint, line);

            // 3) Удаляем событие которе было привязано к BrokenArc.
            DeleteEvent(ref brokenArc);

            // 4) Разбиваем найденную дугу и вставляем между разбитыми половинками нашу новую дугу.
            Arc midleArc = BreakArc(ref brokenArc, curSite);
            Arc leftArc  = midleArc.prev;
            Arc rightArc = midleArc.next;

            // 5) Добавляем рёбра между новыми дугами.
            AddEdge(ref leftArc, ref midleArc);
            AddEdge(ref midleArc, ref rightArc);
            midleArc.rightHalfEdge = midleArc.leftHalfEdge;
            leftArc.rightHalfEdge  = rightArc.leftHalfEdge;

            // 6) Проверям существование события окружности.
            // Для новой левой тройки.
            if (!mBeachLine.IsBlank(leftArc.prev))
            {
                NewCircleEvent(ref leftArc.prev, ref leftArc, ref midleArc);
            }
            // Для новой правой тройки.
            if (!mBeachLine.IsBlank(rightArc.next))
            {
                NewCircleEvent(ref midleArc, ref rightArc, ref rightArc.next);
            }
        }