Как я могу создать заполненный многоугольник из данных неупорядоченных ребер в MATLAB? - PullRequest
8 голосов
/ 08 декабря 2010

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

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

Ответы [ 2 ]

7 голосов
/ 09 декабря 2010

Если ваш многоугольник выпуклый , вы можете просто вычислить выпуклую оболочку из вершин, используя функцию CONVHULL и построить полигон с помощью функции построения PATCH, Например:

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

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

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

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
0 голосов
/ 08 декабря 2010

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

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