Как я могу создать заполненный многоугольник из неупорядоченных краевых данных в MATLAB?

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

Любые предложения, как я могу это сделать?


person MicTech    schedule 08.12.2010    source источник
comment
Как хранятся ваши граничные данные (количество переменных, их размеры и т. д.)?   -  person gnovice    schedule 09.12.2010


Ответы (2)


Если ваш многоугольник выпуклый, вы можете просто вычислить выпуклую оболочку из вершин, используя функцию CONVHULL и начертите многоугольник с помощью функции построения графика ИСПРАВЛЕНИЕ. Например:

x = [0 1 0 1];  %# Unordered x coordinates of vertices
y = [0 1 1 0];  %# Corresponding y coordinates of vertices
hullIndices = convhull(x,y);  %# Gives vertex indices running counterclockwise
                              %#   around the hull
patch(x(hullIndices),y(hullIndices),'r');  %# Plot the polygon in red

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

... но если вам кажется, что для написания кода слишком много работы, вы можете обойти эту проблему, создав ограниченная триангуляция Делоне точек вершин, найти треугольники внутри ограниченных ребер, затем нанесите эти отдельные треугольники, образующие многоугольник, с помощью ИСПРАВЛЕНИЕ. Например:

x = [0 1 0 1 0.5];    %# Unordered x coordinates of vertices
y = [0 1 1 0 0.5];    %# Corresponding y coordinates of vertices
edgeLines = [1 3;...  %# Point 1 connects to point 3
             1 4;...  %# Point 1 connects to point 4
             2 3;...  %# Point 2 connects to point 3
             2 5;...  %# Point 2 connects to point 5
             5 4];    %# Point 5 connects to point 4
dt = DelaunayTri(x(:),y(:),edgeLines);  %# Create a constrained triangulation
isInside = inOutStatus(dt);  %# Find the indices of inside triangles
faces = dt(isInside,:);      %# Get the face indices of the inside triangles
vertices = [x(:) y(:)];      %# Vertex data for polygon
hPolygon = patch('Faces',faces,...
                 'Vertices',vertices,...
                 'FaceColor','r');  %# Plot the triangular faces in red

Выше будет отображаться многоугольник с краевыми линиями вокруг каждого субтреугольника, который его образует. Если вы просто хотите, чтобы линия края отображалась вокруг внешней стороны всего многоугольника, вы можете добавить следующее:

set(hPolygon,'EdgeColor','none');  %# Turn off the edge coloring
xEdge = x(edgeLines).';           %'# Create x coordinates for the edge
yEdge = y(edgeLines).';           %'# Create y coordinates for the edge
hold on;                           %# Add to the existing plot
line(xEdge,yEdge,'Color','k');     %# Plot the edge in black
person gnovice    schedule 08.12.2010
comment
+1 полезный ответ. Я думал о том, чтобы преобразовать точки в полярные координаты и как-то отсортировать по углу. - person Amro; 09.12.2010
comment
@Amro: интересная идея, но технически возможно иметь вогнутый многоугольник с достаточно острыми изгибами, чтобы он мог изменить угловое направление, вроде этот многоугольник. - person gnovice; 09.12.2010
comment
Я понимаю, что моя проблема более сложная, но это отличный ответ на мой вопрос. - person MicTech; 10.12.2010
comment
супер хороший анализ. - person Summer Sun; 19.10.2017

Я думаю, вы ищете функцию patch(). С его помощью можно создавать двухмерные и трехмерные полигоны.

person André Caron    schedule 08.12.2010