Я пытаюсь реализовать систему «черчения» векторной графики, где пользователи могут рисовать линии на экране и взаимодействовать с областями, созданными пересекающимися линиями.Я пытаюсь определить / оценить, что это за области.
Я пробовал несколько разных решений этой проблемы, в основном, ведя список ребер и запуская BFS, чтобы найти кратчайшие циклы, но это привело кМножество проблем, в которых BFS будет сокращаться нелегальными способами, а дырки и вырожденные ребра вызывали больше проблем, чем я мог сосчитать, поэтому я перешел к DCEL, системе полуголовых ребер.
Я читал, казалось бы,все, что я могу по этой теме, включая две статьи, на которые часто ссылаются здесь: http://kaba.hilvi.org/homepage/blog/halfedge/halfedge.htm и http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml. Однако ни одна из них, кажется, не отвечает на эту проблему, которая возникает у меня, когда дело доходит до динамического добавления ребер вgraph.
Допустим, я начинаю с этого единственного ребра. Изображение
Пол ребра соединяются друг с другом в цикле, а глобальная неограниченная «внешняя грань» соединяется с одним из пол ребер.Это просто.
Затем мы добавляем еще одно ребро, прикрепленное к центральной вершине: Изображение
Новые пол ребра работают нормально, и мы обновляем ребра, которыевпадайте в следующие указатели v1, чтобы быть единственными доступными ребрами, которые не являются их близнецами.Опять же, это имеет смысл для меня.
Что меня смущает, так это то, что происходит здесь, когда мы добавляем третий край к центральной вершине: Изображение
Я знаюэто то, что предполагается , чтобы быть похожим и связать, чтобы быть, но я так изумлен, как достичь этого программно, потому что я не уверен, как я могу определить, должен ли край (4,1)указать на ребро (1,2) или ребро (1,3) (аналогично тому, какое ребро должно указывать на (1,4)).
Ответ кажется очевидным при взгляде на изображение, но когда вы пытаетесь рационализировать его надежным, герметичным алгоритмическим способом, мой мозг тает, и я не могу понять это.Учебник, который я читаю (Вычислительная геометрия, Марк де Берг и др., Стр. 35), просто говорит
"[чтобы проверить, где ребро] должно быть в циклическом порядке ребер вокругвершина v ".
Алгоритм, приведенный в статье hilvi.org для поиска исходящих и входящих ребер, с которыми нужно связать, даже не работает, так как он будет принимать вершину 1 и следовать за близнецом своего исходящего ребрапока он не найдет «свободный» край, который в данном случае равен (2,1), что неверно.(Если я не понимаю это неправильно, я мог бы понять всю эту проблему неправильно.)
Так что я совершенно ошеломлен.Моя единственная идея сейчас состоит в том, чтобы создать какой-либо атрибут заголовка для каждой половины ребра, где я измеряю угол, созданный ребром, и выбираю ребра таким образом, и, возможно, это правильно, но это не так, как в структуре пол ребракажется, поддерживает, по крайней мере, в статьях, которые я читаю об этом, кажется, ничто не упоминает ничего подобного.Любая помощь будет принята с благодарностью.Я был над этой проблемой уже больше недели и просто не могу оторваться.