Как изобразить многоугольник с отверстиями?

Обычно популярно работать с полигонами, вершины которых отсортированы по часовой или против часовой стрелки в векторах (матрицы 2 * 1 или 1 * 2). Однако как определить полигоны с дырками в векторах?

Я собираюсь применить различные процессы к этим полигонам, поэтому мне нужен способ представления, с которым я мог бы работать легко или эффективно (например, как указать такие полигоны в моей программе, чтобы упростить мои алгоритмы?)

полигоны 2D, и я программирую в MATLAB.

РЕДАКТИРОВАТЬ 1. Я собираюсь рассчитать график видимости этих многоугольников (с отверстиями или без них).


person Community    schedule 25.06.2009    source источник


Ответы (6)


Как уже упоминалось, многоугольник с отверстиями может быть представлен как внешняя граница плюс ноль или более внутренних границ, все из которых не перекрываются *. Если вы используете ненулевое номер обмотки для определения внутри / снаружи, обязательно укажите внутренние границы в направление, противоположное внешним границам (против часовой стрелки для внешних и по часовой стрелке для внутренних или наоборот), так что контурные интегралы равны нулю внутри отверстий.

К вашему сведению, это определение / представление было формализовано в Спецификации простых функций OpenGIS (PDF) .

Что касается представительства:

У меня, вероятно, был бы массив ячеек из матриц K Nx2, где первый элемент в массиве ячеек - это внешняя граница, а остальные элементы (если есть) в массиве ячеек - это внутренние границы. Я бы использовал массив ячеек, потому что на каждой границе может быть не одинаковое количество точек.

* nonoverlapping = кроме отдельных точек, например ромб внутри квадрата:

alt text alt text

person Community    schedule 29.06.2009

Вы можете разбить многоугольник с отверстием на две формы без отверстия. Когда вы выполняете интеграцию контура в сложной плоскости, вы можете создать «вырез» от одного края многоугольника, который приведет вас к краю отверстия; объединить вокруг одной стороны отверстия и обратно; затем обойдите другую сторону для второго многоугольника. В итоге вы получите два интеграла по траектории вдоль каждого разреза, которые компенсируют друг друга.

"график видимости" - это для расчета коэффициента видимости излучения с затенением? Или графический алгоритм с трассировкой лучей?

person Community    schedule 26.06.2009

Многоугольник плюс список многоугольных отверстий. Просто убедитесь, что разные многоугольники не пересекаются.

Что ты собираешься делать с этой штукой?

person Community    schedule 25.06.2009
comment
Я собираюсь рассчитать график видимости этих многоугольников (с отверстиями или без них). - person Kamran Bigdely; 26.06.2009
comment
как представить список полигональных отверстий? Мне нужен общий, приятный способ их репрезентации (особенно в MATLAB). - person Kamran Bigdely; 26.06.2009
comment
Это похоже на тени? Трассировка лучей? Это просто: у вас должна быть функция, которая определяет, пересекает ли луч простой многоугольник (без отверстий). Затем луч пересекает многоугольник с отверстиями, если он пересекает многоугольник и не пересекает ни одно из отверстий. - person Beta; 26.06.2009
comment
Как изобразить? Может быть, вектор векторов: первый вектор - многоугольник, остальные (если есть) - дыры. - person Beta; 26.06.2009

Похоже, каждая дыра - это просто многоугольник внутри самого многоугольника. Возможно, вы могли бы сохранить вектор, как вы описали, для внешнего многоугольника, а затем вектор других многоугольных векторов для отверстий.

person Community    schedule 25.06.2009

Предположительно, вы захотите иметь древовидную структуру, если хотите, чтобы она была как можно более общей (например, многоугольники с многоугольными отверстиями, внутри которых есть многоугольники с отверстиями внутри, ...). Matlab не очень хорош для эффективного представления древовидных структур, но вот одна идея ...

Имейте структурный массив многоугольников.

Каждый многоугольник представляет собой структуру с двумя полями, «углами» и «дочерними элементами».

Поле 'corners' содержит матрицу (x, y) координат углов, доступ к которой осуществляется как «data {polyIdx} .corners (:, cornerIdx)».

Поле 'children' представляет собой структурный массив многоугольников.

Вот пример кода для создания треугольника с поддельными дочерними элементами, которые являются дырками (на самом деле они не действительны, потому что они, вероятно, будут перекрываться:

polygon = struct;
npoints = 3;
polygon.corners = rand(2,npoints);
polygon.children = struct;
nchildren = 5;
for c=1:nchildren
    polygon.children(c).corners = rand(2,npoints);
    polygon.children(c).children = struct;
end

Вы можете продолжать рекурсивно определять дочерние элементы, которые попеременно создают дыры и заполняют их.

person Community    schedule 26.06.2009
comment
Если вы знаете, что у вас никогда не будет анти-дыр, вы все равно можете использовать ту же структуру данных, но, возможно, вы захотите переименовать «детей» в «дыры». - person Mr Fooz; 26.06.2009
comment
Если вы считаете острова с концентрическими гранями как одну грань, вы не удовлетворяете формуле Эйлера-Пуанкаре. Я не знаю, важно ли это для какого-либо приложения, но для меня этого достаточно, чтобы отказаться от сложности и просто позволить острову в яме быть отдельным лицом. - person Samuel Danielson; 07.02.2020

Что именно вы имеете в виду под «графиком видимости»?

Два «полных» многоугольника, возможны два состояния, +1 или -1.

Если вы представляете дыру, у вас есть одна с состоянием +1 и одна с состоянием -1, что представляет собой дыру, что приводит к состоянию 0.
Если у вас есть перекрывающиеся полигоны, вы в конечном итоге получите с результирующим состоянием> 1. Затем вы можете рассчитать границы нового многоугольника.
Если у вас есть два многоугольника с отверстиями, которые пересекаются, сначала вычислите состояние нового многоугольника, который состоит из внешних границ двух старых, а затем обработайте отверстия .

В любом случае ... Я думаю, вы уловили общий принцип.

Понятия не имею, как это сделать в Matlab, я пока использовал его лишь незначительно, и даже для очень простых вещей.

person Community    schedule 25.06.2009