10

I am looking to create the 15-sided irregular polygon figure below, without having to declare coordinates for each point.

15-sided Irregular Polygon with angles

Is there an easier way to do this? Tikz? PGF?

Calhistorian
  • 1,093

2 Answers2

10

Here's a way to draw this polygon from a list of interior angles. The key points are the \pgfextra{...} command, which allows you to execute code without interrupting the path construction, and the \path commands with the name path keywords within the pgfinterruptboundingbox environment, which are used to find the final corner.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, intersections}

\begin{document}
\begin{tikzpicture}
\def\totalangle{0}
\draw (0,0) -- (0:1cm) \foreach \angle in {152,165,167,160,160,150,150,150,170,145,170,155,170,155}{ 
    \pgfextra{  % Calculate the current direction
        \pgfmathparse{180-\angle+\totalangle}
        \xdef\totalangle{\pgfmathresult}
    }
 -- ++(\totalangle:1cm) node [pos=0, circle, anchor=(\totalangle+\angle/2+180), inner sep=0pt] {$\angle^\circ$}
} coordinate (final);

\pgfmathsetmacro\unknownangle{\totalangle-180}

% The final point is on the intersection between the extensions of the first and last segments.
% Interrupt the bounding box, so we can use long paths for finding the intersection.
\begin{pgfinterruptboundingbox}
    \path [name path global=horizontal] (-20cm,0pt) -- (20cm,0pt);
    \path [name path global=lastsegment] (final) -- +(\totalangle:30cm);
\end{pgfinterruptboundingbox}

\draw [name intersections={of=horizontal and lastsegment}]
    (final) -- (intersection-1)
    node [anchor=south west] {$x$}
    -- (0,0);
\end{tikzpicture}
\end{document}
Jake
  • 232,450
  • If I don't desire to actually calculate the unknown angle (x), how much of the code is necessary? I don't have much experience with pgf. – Calhistorian May 23 '13 at 22:09
  • 1
    The calculation of the angle is only one line \pgfmathsetmacro\unknownangle{\totalangle-180}. The entire second half of the code (from \begin{pgfinterruptboundingbox}) is only necessary because we don't know the length of the individual segments, so if you would precalculate that, the code could be shortened. – Jake May 23 '13 at 22:13
  • Ok. One last thing to confirm answer. Is it possible to add the degree symbol also to all the angles? I imagine this isn't that simple to do. – Calhistorian May 23 '13 at 22:25
  • 1
    @Calhistorian: Sure, just replace node ... {\angle} node ... {$\angle^\circ$}. I've edited my answer. – Jake May 23 '13 at 22:30
  • Ok, I know I said I was finished, but I shrunk the image by half (by modifying the 2cm to 1cm) which subsequently made the angle labels to be too far from the edge. I messed with some things, but can't get the label closer to the edge. – Calhistorian May 23 '13 at 22:43
  • 1
    @Calhistorian: In that case, you need to decrease the inner sep of the label nodes (or set it to 0pt). I've edited my answer. – Jake May 24 '13 at 02:06
4

Here is an adaptation of Circular sequence diagram (tikz?) which will adapt to any number of segments based on the number of labels provided.

enter image description here

Code:

\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}

% https://tex.stackexchange.com/questions/21559/macro-to-access-a-specific-member-of-a-list/21560#21560 \newcommand*\GetListMember[2]{\StrBetween[#2,\number\numexpr#2+1]{,#1,},,\par}%

\newlength{\MidRadius} \newcommand{\LastAngle}{}% \newcommand*{\CircularSequence}[3]{% % #1 = outer circle radius % #2 = inner circle radius % #3 = seqeunce \StrCount{#3}{,}[\NumberOfElements] \pgfmathsetmacro{\AngleSep}{360/(\NumberOfElements+1)} \pgfmathsetlength{\MidRadius}{(#1+#2)/2} \foreach [count = \Count] \Angle in {0,\AngleSep,..., 360} {% \IfStrEq{\LastAngle}{}{}{% \draw [blue, ultra thick] (\LastAngle:#1) -- (\Angle:#1); }% \xdef\LastAngle{\Angle}% Save it so we can access it next iteration \pgfmathsetmacro{\MidPoint}{\Angle+\AngleSep/2} \node at (\MidPoint:\MidRadius) {\GetListMember{#3}{\Count}}; }% }% \begin{document} \begin{tikzpicture} \CircularSequence{4.0cm}{3.0cm}{170,155,170,165,$x$,163,155,167,170,160,140,150,172,170,145} \end{tikzpicture} \end{document}

Peter Grill
  • 223,288
  • 2
    I thought the OP wanted the irregular polygon with the corner angles given by the labels. – Jake May 23 '13 at 20:38
  • @Jake: Good point, it is not really clear as the OP desires to not specify the points of each of the coordinates. Also, note that the labels are not in order, so even more confusing. – Peter Grill May 23 '13 at 20:40