Я хочу сделать что-то, чего все остальные обычно избегают:
У меня есть два полигона (объекты многоугольника), layer1
и layer2
. layer1
должно быть расширено точками пересечения двух многоугольников. По определению эти точки коллинеарны с ребрами layer1
. Я хочу, чтобы это работало для любой формы многоугольника.
Пример:
Предположим, это определение для двух полигонов:
square = polyshape([0,0;0,6;6,6;6,0]);
layer1 = addboundary(square, [1,2,5,4], [1,1,5,5]);
layer2 = addboundary(square, [4,5,2,1], [1,1,5,5]);
Ожидаемый результат после добавления расширения:
>> layer1.Vertices
ans =
0 0
0 6.0000
6.0000 6.0000
6.0000 0
NaN NaN
1.0000 1.0000
2.0000 1.0000
3.0000 2.3333
3.5000 3.0000
5.0000 5.0000
4.0000 5.0000
3.0000 3.6667
2.5000 3.0000
Подходы к решению:
Matlab предоставляет два многообещающих инструмента: для каждой булевой функции (пересечение, объединение, xor, вычитание) можно указать коллинеарные точки. И каждая логическая функция также возвращает shapeID
и vertexID
, сообщая вам, откуда берется каждая точка.
- Сначала я подумал, что будет достаточно добавить все очки с
shapeID == 0
. Но я не знаю, как расположить эти дополнительные точки в правильном порядке с уже существующими точками.
- Итак, я попробовал некоторые вещи, комбинирующие логические функции.
layer1 = union(layer1, subtract(layer1, layer2), 'KeepCollinearPoints', true);
не перехватывает все пересечения (по причине, которую я не понимаю - это работает для layer2 = union(layer2, subtract(layer2, layer1), 'KeepCollinearPoints', true);
).
Что-то вроде
[layer1,shapeID,~] = intersect(layer1,layer2);
layer1 = polyshape(layer1.Vertices(shapeID~=2,:), 'KeepCollinearPoints', true);
, кажется, работает, но не для всех форм многоугольников (например, layer1 = addboundary(square, [1,5,2.5], [2,2,4]);
не имеет желаемого результата)
Я чувствую, что должно быть элегантное решение моей проблемы, которого я еще не нашел. Я ценю любую помощь.