2010-12-08 9 views

Respuesta

7

Si su polígono es convex, puede calcular el casco convexo desde los vértices usando la función CONVHULL y trazar el polígono usando la función de trazado PATCH. Por ejemplo:

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 

Si el polígono es cóncavo en lugar , que se vuelve más complicado. Tendría que reordenar las líneas de borde usted mismo comparando sus puntos finales y ordenándolos en sentido horario o antihorario.

... pero si eso suena como demasiado trabajo para codificar hasta, puede eludir el problema creando un constrained Delaunay triangulation de los puntos de vértice, find the triangles on the inside of the constrained edges, a continuación, trazar estos triángulos individuales que forman el polígono utilizando PATCH. Por ejemplo:

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 

Lo anterior se mostrará el polígono con líneas de borde alrededor de cada sub-triángulo que lo forma. Si solo desea que se muestre una línea de borde alrededor de todo el polígono, puede agregar lo siguiente:

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

+1 respuesta útil. Estaba pensando en convertir los puntos en coordenadas polares y ordenar de alguna manera por el ángulo. – Amro

+0

@Amro: Una idea interesante, pero técnicamente es posible tener un polígono cóncavo con curvas suficientemente agudas que podría invertir la dirección angular, algo así como [ este polígono] (http://www.gamasutra.com/features/20000210/lander_figure_02.gif). – gnovice

+0

Me doy cuenta de que mi problema es más complejo, pero esta es la mejor respuesta para mi pregunta. – MicTech

0

Creo que está buscando la función patch(). Puedes hacer polígonos en 2-D y 3-D con él.

Cuestiones relacionadas