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

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

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

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