# label all vertices in polygon plot

Let's say I have the following plot Graphics[{Opacity[0.2], Rectangle[{0, 0}, {4, 4}]}]

And I want to label all vertices on the graph to give their coordinates, in this case, Point(0,0) as "P1", Point(0,4) as "P2"...

In general, I want to write a function: plotPolygonWithLabel[polygon_, label_]:=...

where label_ is the array like {"P1", "P2", } here

-

There are many methodst to achieve that, You can start with this:

points = Table[2 {Cos@t, Sin@t}, {t, 0, 2 Pi - .2 Pi, .2 Pi}]
labels = Table["P" <> ToString[t], {t, Length@points}]

f[points_, labels_] :=With[{O = Mean@points},
Graphics[{Polygon@points,
Text[#1, #2] & @@@ ({labels, ((.2 + Norm[# - O]) (
Normalize[# - O]) + O) & /@ points}\[Transpose])}]]

f[points,labels]


-

A slightly generalized version of Kuba's answer, by placing labels along the angular bisectors, which I think can handle most simply irregular polygons:

Clear[offsetFunc]
offsetFunc[pts : {Repeated[_List, {3}]}] :=
Normalize[Most[Cross[{0, 0, 1},
Append[Total[Normalize /@ Differences[pts]], 0]
]]]

Clear[labeledPolygon]
labeledPolygon[points_, labels_, offset_: 1] :=
{
Polygon@points,
Text[Style[#1, Red, Bold],
#2[[2]],
offset offsetFunc[#2]] & @@@
({labels, Partition[points, 3, 1, {2, 2}]}\[Transpose])
}


Example:

points = Table[RandomReal[{1, 3}] {Cos[t], Sin[t]}, {t, 0, 2 π, π/10}] // Most;

labels = Table["P" <> ToString[t], {t, Length@points}];

Graphics[{EdgeForm[{Lighter@Blue, Thick}], labeledPolygon[points, labels, 2]}]


It may not perform well on non-simple polygon:

-

A different approach, but needs tweaking for graphical perfection:

plotPolygonWithLabel[polygon_, label_, fontSize_] :=
{Polygon[polygon],
{EdgeForm[Thin],
FaceForm[White],
Disk[#1, (fontSize + 12)/72],
Text[Style[#2, Black, fontSize,
FontFamily -> "Helvetica Bold",
Background -> White], #1]} & ,
{polygon, label}]}

(* borrowing from Silvia ... *)
points = Table[
RandomReal[{-3, 3}] {2 Cos[t], 2 Sin[t]}, {t, 0, 2 \[Pi], Pi/5}];

labels = Table["P" <> ToString[t], {t, Length@points}];

Graphics[{plotPolygonWithLabel[points, labels, 14]}]


-