Участник:Kabanov — различия между версиями
Kabanov (обсуждение | вклад) м (Сумма) |
Kabanov (обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
|statement=Для заданного робота <tex>R</tex> и препятствия <tex>P</tex>, К-препятствием является множество <tex>P \oplus (-R(0, 0))</tex>. | |statement=Для заданного робота <tex>R</tex> и препятствия <tex>P</tex>, К-препятствием является множество <tex>P \oplus (-R(0, 0))</tex>. | ||
|proof= | |proof= | ||
− | [[Файл:minkowski_sum.png | right | | + | [[Файл:minkowski_sum.png | right | 150px]] |
Необходимо доказать, что робот <tex>R(x, y)</tex> пересекает препятствие <tex>P</tex> в том и только в том случае, если <tex>(x, y) \in P \oplus (-R(0, 0))</tex>. | Необходимо доказать, что робот <tex>R(x, y)</tex> пересекает препятствие <tex>P</tex> в том и только в том случае, если <tex>(x, y) \in P \oplus (-R(0, 0))</tex>. | ||
Версия 21:45, 20 января 2015
Описание
Сумма Минковского позволяет решать задачу Motion Planning, в случае, когда робота нельзя поворачивать. Таким образом, каждой точке
ставится в соответствие фигура робота , с точкой привязки помещенной в точку .Определение: |
Для заданного робота | и препятствия , К-препятствием называется множество точек, будучи помещенным в которые, робот заденет препятствие:
Определение: |
Суммой Минковского двух множеств | называется множество , где обозначает векторную сумму.
Определение: |
Отрицанием множества | называется множество , где обозначает векторное отрицание.
Теорема: |
Для заданного робота и препятствия , К-препятствием является множество . |
Доказательство: |
Необходимо доказать, что робот пересекает препятствие в том и только в том случае, если .Пусть робот задевает препятствие, и точка В обратную сторону, пусть является точкой пересечения. Тогда, так как , то , или . А заметив, что , получаем . , тогда существуют точки и такие, что или , а это означает, что пересекает . |
Допустим, для простоты, что робот и все препятствия выпуклые, а позже обобщим для невыпуклых фигур.
Теорема: |
Пусть заданы две выпуклые фигуры и , с числом вершин и соответственно. Тогда суммой Минковского является выпуклая фигура с не более чем вершинами. |
Доказательство: |
Для начала заметим, что любая крайняя точка в направлении вектора Теперь рассмотрим произвольное ребро есть сумма крайних точек фигур в этом направлении. Убедиться в этом можно спроецировав обе фигуры на вектор . из . Оно является крайним в направлении к своей нормали, а значит оно образовано крайними точками фигур, и хотя бы у одной из фигур должно быть ребро, которое является крайним в этом направлении. Сопоставим с этим ребром. Тогда сопоставив таким образом всем ребрам ребра исходных фигур, получаем что всего ребер в не более чем , так как каждое ребро исходных фигур использовалось не более раза. |
Псевдокод
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 возвращает значение полярного угла вектора, заданного ее аргументами.Корректность алгоритма следует из доказательства предыдущей теоремы, а время работы равно
, так как на каждой итерации хотя бы один из индексов и увеличивается.Случай невыпуклых фигур
Для начала заметим следующий факт:
В случае, когда одна из фигур невыпукла, её сначала надо затриангулировать, получив
треугольников. После этого, уже известным алгоритмом, надо построить выпуклых фигур с не более чем вершинами, которые будут суммами Минковского соответствующих треугольников. Объединение этих выпуклых фигур будет состоять из вершин.В случае, когда обе фигуры невыпуклы, обе эти фигуры надо затриангулировать, получив
и треугольников соответственно. Построив суммы Минковского множеств этих треугольников получим выпуклых фигур, объединение которых состоит из вершин.