Маркировка вершин многоугольника в Mathematica - PullRequest
6 голосов
/ 03 августа 2011

Учитывая набор точек на плоскости T={a1,a2,...,an}, тогда Graphics[Polygon[T]] построит полигон, сгенерированный точками. Как добавить метки к вершинам многоугольника? Иметь только индекс в качестве метки было бы лучше, чем ничего. Есть идеи?

Ответы [ 3 ]

9 голосов
/ 03 августа 2011
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

Для добавления точки также

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

обновление:

Используйте индекс:

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

7 голосов
/ 03 августа 2011

версия Насера ​​(обновление) использует сопоставление с образцом . Этот использует функциональное программирование . MapIndexed дает вам координаты и их индекс без необходимости Position, чтобы найти его.

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

или, если вам не нравится MapIndexed, вот версия с Apply (на уровне 1, инфиксная нотация @@@).

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])
  }
 ]

Это может быть расширено до произвольных меток следующим образом:

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 голосов
/ 16 августа 2011

Для этого вы можете использовать опции GraphPlot. Пример:

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

Graphics[{Polygon@c, g[[1]]}]

Таким образом, вы также можете использовать VertexLabeling -> Tooltip или VertexRenderingFunction, если хотите. Если вы не хотите, чтобы края накладывались друг на друга, вы можете добавить EdgeRenderingFunction -> None к функции GraphPlot. Пример:

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, Polygon@c, g[[1]]}]

enter image description here

...