![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Polygon UsageBoost , ,Minkowski Sum TutorialВ этом уроке мы реализуем алгоритм для вычисления суммы Минковского из двух наборов многоугольников. Сумма Минковского двух многоугольных множеств является свёрткой двух многоугольных множеств и определяется как множество точек, которое производится, если суммировать все пары точек в двух многоугольных множеств. Сумма двух баллов реализована в Boost. Полигон по функции convolve для point_concept. Аналогично существует функция convolve для rectangle_concept. Свёртка двух наборов полигонов производит набор полигонов в качестве своего выхода. Пример свёртки двух полигонов показан ниже. Можно представить, что центральная точка зеленой звезды свободно скользит внутри синей рамки изображения, рисуя область, к которой прикасается звезда, чтобы создать красную раздутую раму изображения. <0 Вышеуказанное изображение было создано с использованием кода, представленного в этом руководстве. Мы видим, что алгоритм суммы Минковского должен поддерживать невыпуклые многоугольники, которые потенциально могут иметь отверстия. Он также должен поддерживать разъединенные полигоны в обоих наборах входных полигонов. показано ниже, что происходит, когда в каждом наборе входных многоугольников присутствует несколько многоугольников. В каждом из этих примеров происхождение системы координат находится в нижнем левом углу изображения, а сумма расположений x и y входных многоугольников помещает результат в верхний правый угол изображений. В примере над нижним левым красным треугольником находится свертка маленького голубого треугольника с маленьким зеленым треугольником. Верхний правый красный треугольник представляет собой свертку большого синего и большого зеленого треугольника. Два красных многоугольника среднего размера являются результатом свёртывания малого с большим и большого с маленькими синими и зелеными треугольниками. Испытательный случай был тщательно разработан, чтобы предотвратить слияние результатов, хотя это, безусловно, может произойти. Алгоритм, реализованный для суммы Минковского в этом учебнике, очень прост. Она основана на свёртке полигонных краев. Свёртка двух краев очень проста в вычислении и в целом является параллелограммом. Пример двух краев, скрученных для получения параллелограмма, показан ниже. Теперь, когда мы знаем, что нам нужно от функции, чтобы связать два края, давайте реализуем один сейчас. Ниже мы показываем код для соединения двух краев вместе с некоторыми определениями типов, которые мы будем использовать во всем учебнике. Код для этого учебника доступен в minkowski.cpp. typedef boost::polygon:: point_data Эта функция для соединения двух линейных сегментов просто сворачивает конечные точки двух линейных сегментов во всех комбинациях для получения четырех точек параллелограмма и заполняет вектор точек с ними в правильном порядке. Мы используем бум. Функция библиотеки полигона для соединения двух точек и структура данных точки библиотеки. Чтобы вычислить свёртку двух многоугольных множеств, мы начинаем с объединения свёртки всех пар краев между двумя многоугольными множествами. Учитывая операцию по соединению двух краев, довольно легко совместить все пары краев двух наборов многоугольников. Результатом является свертка периметров многоугольников, но не справляется со сверткой их интерьеров. Чтобы проиллюстрировать это, мы показываем, что происходит, когда один из вышеперечисленных примеров вычисляется с использованием только всех пар краев свертки. <0 Как мы видим, результат выглядит так, как если бы маленькие треугольники скользили по периметру больших треугольников, оставляя отверстие в центре, которое должно быть заполнено, если бы маленькому треугольнику было позволено свободно скользить внутри большого треугольника. Также доступен в Boost. Полигон — это функция convolve для polygon_concept, которая сворачивает многоугольник над точкой. Все это переводит многоугольник на значение точки x и y. Для заполнения внутренних областей результата свертки двух многоугольных множеств мы выполняем все пары многоугольной свертки к первой вершине другого многоугольника и сливаем ее в союз краевых извилин. Давайте реализуем остальную сумму Минковского из двух многоугольных множеств как объединение всех пар краевых извилин и всех пар многоугольников для указания извилин. Сначала мы реализуем функцию, которая объединяет все пары ребер, представленных парами итераторов над точками. Мы предполагаем, что первая точка равна последней точке в каждой последовательности, потому что мы знаем, что многоугольники, которые дали начало итераторам, были произведены Boost. Алгоритм полигона для формирования общего полигона. template Используя функцию, определенную выше, мы можем реализовать функцию для вычисления свертки всех пар краев, представленных парой итераторов над точками и краями в наборе многоугольников. Мы просто называем последовательности convolve_two_point_sequences для входной точечной последовательности и всех внешних оболочек и отверстий из контейнера полигонов. template Используя функцию, определенную выше, мы можем реализовать функцию для вычисления свёртки всех пар краев из многоугольников, содержащихся в двух многоугольных множествах. Мы также соединяем каждый многоугольник с первой вершиной каждого многоугольника из другого набора, чтобы заполнить интерьеры результата. лишены convolve_two_polygon_sets (polygon_set&результат, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set& a, const polygon_set ; ; ; ; ; ; ; ; ; ; itrh = start_holes(a_polygons[ai]); Мы проверяем свертку двух многоугольников с кодом, показанным ниже, который дает первый пример, показанный в этом учебнике. polygon_set a, b, c; Выход (а синий, б зеленый и с красный): На этом завершается наше руководство о том, как реализовать сумму полигонов Минковского в качестве свертки многоугольных множеств на основе булевой ИЛИ работы геометрии, создаваемой более простыми функциями свертки, предоставляемыми Boost. Полигонская библиотека.
Статья Polygon Usage раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |