I think you can regard each one of your edges/vertices as a complex number, so walk along the path given an angle set will be equivalent to adding the corresponding number set successively. And if the total is $0$, it means the path is closed, thus a polytan.
This is a possible implementation:
Clear[polytanPlot]
polytanPlot[angleSet_] :=
Module[{stepVecSet},
(* step set represented as complex numbers: *)
stepVecSet =
If[IntegerQ[#/(π/2)], 1, Sqrt[2]] Exp[# I] I & /@
Mod[Accumulate[angleSet - π], 2 π];
(* closed path criterion: *)
If[Chop[N[Total[stepVecSet]]] != 0,
Style[Row[{Style[angleSet, 13], " is not a valid polytan angle set!"}], 15, Red],
(* draw the polytan: *)
pts = Through[{Re, Im}@Accumulate[stepVecSet]]\[Transpose];
Graphics[{FaceForm[], EdgeForm[{Thick, Blue}],
Polygon[pts],
Darker[Green], AbsolutePointSize[15], Point[pts]},
Frame -> True, PlotLabel -> Style[angleSet, 13]]
]]
polytanPlot /@ FullSimplify[
{{270, 315, 315}, {315, 270, 315}, {315, 315, 270}} π/180
] // Column
Cases[polytanPlot /@ RandomChoice[π/4 Range[7], {1000, 10}], Graphics[__], ∞]
Edit:
For the test data set asked by OP in the comment:
testSets = Select[Tuples[{0,45,90,135,180,225,270,315}, 5], Total[#] == (5 + 2)*180 &];
Cases[polytanPlot /@ FullSimplify[testSets π/180], Graphics[__], ∞]
Note the interior angles at some vertices are $0$, so adjacent edges there get overlapped. Also some edges intersect each other at some non-vertex point (e.g. in the last graph above), makes it look like triangles with length $1$ hypotenuse, although they are merely self-intersected polytans.
If we want to avoid polytans with overlapped edges or with sub-polytans in it, we can test the closed path criterion on every continuous sub-set of the input angle set. This modified version might decrease the number of self-intersected result too, if not totally prevent.
Clear[polytanPlot2]
polytanPlot2[angleSet_] :=
Module[{stepVecSet, len, nosubCircuitQ, pts},
stepVecSet = If[IntegerQ[#/(π/2)], 1, Sqrt[2]] Exp[# I] I & /@
Mod[Accumulate[angleSet - π], 2 π];
len = Length[stepVecSet];
nosubCircuitQ = True;
Table[
If[#, nosubCircuitQ = False; Goto["label"]] &[
Chop[N[Total[stepVecSet[[i ;; j]]]]] == 0],
{i, len - 1}, {j, i + 1, If[i == 1, len - 1, len]}];
Label["label"];
If[nosubCircuitQ && Chop[N[Total[stepVecSet]]] == 0,
pts = Through[{Re, Im}@Accumulate[stepVecSet]]\[Transpose];
Graphics[{FaceForm[], EdgeForm[{Thick, Blue}],
Polygon[pts],
Darker[Green], AbsolutePointSize[15], Point[pts]},
Frame -> True, PlotLabel -> Style[angleSet, 13]],
Style[Row[{Style[angleSet, 13],
" is not a valid polytan angle set!"}], 15, Red]
]]
Cases[polytanPlot2 /@ FullSimplify[testSets π/180], Graphics[__], ∞]
Self-intersected results are still found:
Cases[polytanPlot /@ RandomChoice[π/4 Range[7], {2000, 15}], Graphics[__], ∞]
Edit 2:
According to J.M.'s comment, we can use an undocumented function Graphics`Mesh`SimplePolygonQ[]
to achieve the purpose of avoiding both overlappings and self-intersections:
Clear[polytanPlot3]
polytanPlot3[angleSet_] :=
Module[{stepVecSet, pts, polyg},
stepVecSet = If[IntegerQ[#/(π/2)], 1, Sqrt[2]] Exp[# I] I & /@
Mod[Accumulate[angleSet - π], 2 π];
If[Chop[N[Total[stepVecSet]]] != 0,
Style[Row[{Style[angleSet, 13], " is not a valid polytan angle set!"}], 15, Red],
pts = Through[{Re, Im}@Accumulate[stepVecSet]]\[Transpose];
polyg = Polygon[pts];
If[Graphics`Mesh`SimplePolygonQ[polyg],
Graphics[{FaceForm[], EdgeForm[{Thick, Blue}], polyg,
Darker[Green], AbsolutePointSize[15], Point[pts]
}, Frame -> True, PlotLabel -> Style[angleSet, 13]],
Style[Row[{Style[angleSet, 13], " is not a simple polytan angle set!"}], 15, Red]
]
]]
Cases[polytanPlot3 /@ RandomChoice[π/4 Range[7], {2000, 15}], Graphics[__], ∞]