Сумма Минковского (определение, вычисление)
Версия от 20:31, 20 января 2015; Kabanov (обсуждение | вклад)
Описание
Определение: |
Суммой Минковского двух множеств | называется множество , где обозначает векторную сумму.
Определение: |
Отрицанием множества | называется множество , где обозначает векторное отрицание.
Теорема: |
Для заданного робота и препятствия , К-препятствием является множество . |
Доказательство: |
Необходимо доказать, что робот пересекает препятствие в том и только в том случае, если .Пусть робот задевает препятствие, и точка В обратную сторону, пусть является точкой пересечения. Тогда, так как , то , или . А заметив, что , получаем . , тогда существуют точки и такие, что или , а это означает, что пересекает . |
Допустим, для простоты, что робот и все препятствия выпуклые, а позже обобщим для невыпуклых фигур.
Теорема: |
Пусть заданы две выпуклые фигуры и , с числом вершин и соответственно. Тогда суммой Минковского является выпуклая фигура с не более чем вершинами. |
Доказательство: |
Для начала заметим, что любая крайняя точка в направлении вектора Теперь рассмотрим произвольное ребро есть сумма крайних точек фигур в этом направлении. Убедиться в этом можно спроецировав обе фигуры на вектор . из . Оно является крайним в направлении к своей нормали, а значит оно образовано крайними точками фигур, и хотя бы у одной из фигур должно быть ребро, которое является крайним в этом направлении. Сопоставим с этим ребром. Тогда сопоставив таким образом всем ребрам ребра исходных фигур, получаем что всего ребер в не более чем , так как каждое ребро исходных фигур использовалось не более раза. |
Псевдокод
i = j = 0 V[n] = V[0], V[n+1] = V[1], W[n] = W[0], W[n+1] = W[1] while i < n or j < m do add V[i]+W[j] to answer if angle(V[i], V[i+1]) < angle(W[j], W[j+1]) ++i else if angle(V[i], V[i+1]) > angle(W[j], W[j+1]) ++j else ++i, ++j
Здесь множества точек
и отсортированы в порядке обхода против часовой стрелки, причем первым элементом в обоих массивах является самая левая нижняя точка множества. Функция angle возвращает значение полярного угла вектора, заданного ее аргументами.Корректность алгоритма следует из доказательства предыдущей теоремы, а время работы равно
, так как на каждой итерации хотя бы один из индексов и увеличивается.Случай невыпуклых фигур
Для начала заметим следующий факт:
В случае, когда одна из фигур невыпукла, её сначала надо затриангулировать, получив
треугольников. После этого, уже известным алгоритмом, надо построить выпуклых фигур с не более чем вершинами, которые будут суммами Минковского соответствующих треугольников. Объединение этих выпуклых фигур будет состоять из вершин.В случае, когда обе фигуры невыпуклы, обе эти фигуры надо затриангулировать, получив
и треугольников соответственно. Построив суммы Минковского множеств этих треугольников получим выпуклых фигур, объединение которых состоит из вершин.Ссылки
- Английская википедия
- de Berg, van Kreveld, Overmars, Schwarzkopf "Computational Geometry Algorithms and Applications", p. 290