Что содержит береговая линия в алгоритме Fortune?

Я пытаюсь реализовать алгоритм Фортуны в Джулии, чтобы найти многоугольники Вороного массива случайных точек, но я действительно борюсь с береговой линией.

Я знаю, что береговая линия — это соединение нескольких парабол. Каждая парабола имеет точку из массива в качестве фокуса, поэтому пересечение парабол, расположенных рядом друг с другом, дает «край» между двумя областями Вороного. Каждая точка в массиве будет событием для береговой линии, но также будет нечто, называемое «круговыми точками», которые соответствуют полюсу (самому нижнему в данном случае) круга, который проходит через три «реальные точки». , а реальные точки — это точки в массиве случайных точек.

Я знаю, как пересекать параболы, я также знаю, что когда линия берега проходит через реальную точку, ее парабола будет половиной линии, пересекающей параболы предыдущих точек, и это пересечение легко найти.

Как вы храните пляжную линию? Вы просто сохраняете точки пересечения, когда проходите события, вычисляя каждое пересечение парабол соседей?

Я читаю Алгоритмы и приложения вычислительной геометрии Марка де Берга, но мой родной язык не английский, поэтому мне немного сложно понять некоторые вещи.

Так что было бы здорово, если бы вы могли помочь мне в этом, спасибо заранее.

Добро пожаловать в StackOverflow. Вы задаете хорошие вопросы. Не могли бы вы выбрать самый важный и отредактировать свой вопрос, чтобы начать с него? Кроме того, не могли бы вы показать свои исследования и то, что вы уже пробовали?

rajah9 27.05.2019 14:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При принятии решения о том, как представлять линию пляжа, важно учитывать, что каждое «событие», которое вы обрабатываете в ходе алгоритма, должно вносить в него только местный модификаций. Если линия развертки немного перемещается, но не пересекает никаких событий, то ваше представление береговой линии не должно изменяться.

Следовательно, структура данных линии пляжа не должна включать никаких фактических точек на линии пляжа!

Также важно, чтобы вы могли найти части для модификации за время O(log N).

Самое простое представление — это просто бинарное дерево поиска, содержащее входные точки, которые вносят вклад в параболы береговой линии, по порядку. Изменения, сделанные во время каждого события, состоят из добавления или удаления отдельных точек.

Итак, изменения линии пляжа будут просто добавлять точки, с которыми пересекается линия развертки, по порядку, в этом случае линия развертки горизонтальна, поэтому они будут упорядочены с использованием координаты x, верно? А также если новое событие разбило одну параболу на две, например, у вас есть две точки [x1,y1] и [x2,y2], при этом y2<y1 и x2 близки к x1, когда линия развертки находится во второй точке, моя береговая линия вместо [x1,y1] станет [x1,y1],[x2,y2],[x1,y1]?

Luis.Alberto 27.05.2019 22:07

Да все верно. вы также должны удалять точки, когда их параболы перекрываются соседними параболами. Все эти события упорядочены по приоритетной очереди в соответствии с координатой x линии развертки, когда они происходят.

Matt Timmermans 28.05.2019 05:14

Другие вопросы по теме