В соответствии с вашим примером вы пытаетесь найти грани плоского графа, определяемые его вершинами и ребрами.
Шаг 1. Замените все свои-направленные ребра парой направленных ребер (дуг), соединяющих вершины в обоих направлениях.Для каждой дуги (v1 -> v2) найдите следующую дугу (v2 -> v3), чтобы обе эти дуги имели одинаковую грань слева из них - это может бытьделается путем вычисления углов между дугами и осью (скажем) OX и упорядочением их по часовой стрелке (или против часовой стрелки).Отметьте все дуги как «неиспользованные».
Шаг 2. Подберите любую «неиспользуемую» дугу и следуйте по следующим дугам один за другим, пока не достигнете начала начальной дуги - вы 'Я получу цикл, ограничивающий лицо.Вы нашли новое лицо со всеми его дугами / вершинами.Отметьте все дуги в этом цикле как «используемые».Повторяйте до тех пор, пока не останется «неиспользуемых» дуг.
Возвращаясь к своему примеру - вы получите следующие дуги:
A -> E, E -> A
A -> D, D -> A
B -> E, E -> B
B -> F, F -> B
C -> D, D -> C
C -> G, G -> C
E -> F, F -> E
E -> G, G -> E
F -> G, G -> F
Примеры следующие дуги:
- (D -> C) - следующая дуга для (A -> D)
- (C -> G) - следующая дуга для (D -> C)
- (G -> E) - следующая дуга для (C -> G)
- и т. Д. *
Этот алгоритм найдет все ваши внутренние грани плюсодна внешняя грань, ограниченная циклом (A -> E, E -> B, B -> F, F -> G, G -> C, C -> D, D -> A),Вы можете игнорировать эту внешнюю грань, но в некоторых случаях она может быть полезна - например, когда вам задана точка, и вам нужно найти ее положение относительно вашего графика в целом.