2011-08-03 32 views
6

Dado un conjunto de puntos en el plano T={a1,a2,...,an}, Graphics[Polygon[T]] trazará el polígono generado por los puntos. ¿Cómo puedo agregar etiquetas a los vértices del polígono? Tener simplemente el índice como una etiqueta sería mejor que nada. ¿Algunas ideas?Etiquetado de vértices de un polígono en Mathematica

Respuesta

9
pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> Text[Style[{x, y}, Red], {x, y}]}} 
] 

enter image description here

Para añadir puntos también

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> Text[Style[{x, y}, Red], {x, y}, {0, -1}]}, 
    {pts /. {x_, y_} :> {Blue, PointSize[0.02], Point[{x, y}]}} 
    } 
] 

enter image description here

actualización:

uso del índice:

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> 
    Text[Style[Position[pts, {x, y}], Red], {x, y}, {0, -1}]} 
    } 
] 

enter image description here

+0

Esto es realmente agradable. Casi lo que estoy buscando. ¿Cómo puede alterar su ejemplo y obtener el índice del vértice como una etiqueta en lugar de las coordenadas? ¡Gracias por adelantado! – Dror

+0

agregado para actualizar .... – Nasser

+0

¡GUAU! ¡Eso es realmente genial! ¿Puedes agregar alguna explicación sobre la magia? – Dror

7

Nasser's version (update) utiliza pattern matching. Este usa functional programming. MapIndexed le da las coordenadas y su índice sin la necesidad de Position para encontrarlo.

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    MapIndexed[Text[Style[#2[[1]], Red], #1, {0, -1}] &, pts] 
    } 
] 

enter image description here

o, si no te gusta MapIndexed, aquí es una versión con Apply (en el nivel 1, la notación infija @@@).

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
idx = Range[Length[pts]]; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    Text[Style[#2, Red], #1, {0, -1}] & @@@ ({pts, idx}\[Transpose]) 
    } 
] 

esto se puede ampliar a las etiquetas arbitrarias de la siguiente manera:

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
idx = {"One", "Two", "Three"}; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    Text[Style[#2, Red], #1, {0, -1}] & @@@ ({pts, idx}\[Transpose]) 
    } 
] 

enter image description here

0

puede aprovechar las opciones de GraphPlot para esto. Ejemplo:

c = RandomReal[1, {3, 2}] 
g = GraphPlot[c, VertexLabeling -> True, VertexCoordinateRules -> c]; 

Graphics[{[email protected], g[[1]]}] 

esta manera también se puede hacer uso de VertexLabeling -> Tooltip, o VertexRenderingFunction si quieres. Si no desea superponer los bordes, puede agregar EdgeRenderingFunction -> None a la función GraphPlot. Ejemplo:

c = RandomReal[1, {3, 2}] 
g = GraphPlot[c, VertexLabeling -> All, VertexCoordinateRules -> c, 
    EdgeRenderingFunction -> None, 
    VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .02], 
     Black, Text[#2, #1]} &)]; 

Graphics[{Brown, [email protected], g[[1]]}] 

enter image description here

Cuestiones relacionadas