/// <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); } }
/// <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); } }