Добавьте коллинеарные точки к полишапле (Matlab) - PullRequest
0 голосов
/ 25 января 2019

Я хочу сделать что-то, чего все остальные обычно избегают: У меня есть два полигона (объекты многоугольника), 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]); не имеет желаемого результата)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...