Zeichnen eines regelmäßigen n-Ecks mit TikZ automatisieren
Hallo liebe TeXWelt-Community,
ich versuche mir ein Kommando zu definieren, um ein regelmäßiges n-Eck mit TikZ zeichnen zu lassen. Dabei übergebe ich die Anzahl der Ecken, den Radius und eventuelle tikzpicture-optionen beim Aufruf des Kommandos. Es gibt ein Problem beim Runden der counter-Variable, so dass ich bei einem regelmäßigen 17-Eck z.B. nicht auf das gewünschte Ergebnis komme. Ich habe im Netz verschiedenste Möglichkeiten gefunden wie man rundet (mit den Paketen calculator oder siunitx z.B.) Bin aber nie auf eine Variante gekommen die durchkompiliert. Es wäre cool wenn mir jemand weiterhelfen könnte. Es gibt sicherlich eine einfache Lösung, aber ich komme leider nicht drauf.
\documentclass[margin=5pt]{standalone}
\usepackage{pdfpages}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcounter{x}
\newcounter{y}
\newcommand{\nEck}[3]{
\setcounter{x}{360/#1}
\setcounter{y}{\value{x}*2}
\begin{tikzpicture}[#3]
\foreach \angle in {\thex,\they,...,360} {
\draw ($(0,0) + cos(\angle)*(#2,0) + sin(\angle)*(0,#2)$) -- ($(0,0) + cos(\angle +\thex)*(#2,0) +sin(\angle +\thex)*(0,#2)$);
}
\end{tikzpicture}
}
\begin{document}
\nEck{8}{2}{rotate=22.5}
\hspace{1cm}
\nEck{17}{2}{}
\hspace{1cm}
\begin{tikzpicture}[rotate=22.5]
\foreach \angle in {45,90,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +45)*(2,0) +sin(\angle +45)*(0,2)$);
}
\end{tikzpicture}
\hspace{1cm}
\begin{tikzpicture}[rotate=22.5]
\foreach \i in {0,45,...,135}{
\fill[gray, opacity=0.5] (0,0) -- ($(0,0) + cos(\i)*(2,0) + sin(\i)*(0,2)$) -- ($(0,0) + cos(\i +45)*(2,0) +sin(\i +45)*(0,2)$) -- cycle;
}
\foreach \angle in {45,90,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +45)*(2,0) +sin(\angle +45)*(0,2)$);
}
\end{tikzpicture}
\end{document}\end{document}
Nachtrag:
Da ich offensichtlich meine Frage nicht eindeutig genug gestellt habe, nun hier ein kleiner Nachtrag. Bisher habe ich das Arbeitsblatt für meine Schüler wie folgt gestaltet, wobei hier ein kleiner Auszug der Aufgabe zu sehen sein soll:
\documentclass[a4paper]{article}
\usepackage{amsmath}
\usepackage{multicol}
\usepackage[shortlabels]{enumitem}
\usepackage{pdfpages}
\usepackage{geometry}
\geometry{a4paper, top=15mm, left=15mm, right=20mm, bottom=15mm, headsep=10mm, footskip=10mm}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
topline/.style={baseline={([yshift=#1]current bounding box.north)}},
topline/.default=-\ht\strutbox
}
\begin{document}
Erweitere bzw. kürze den Bruch geeignet und male dann die entsprechenden Bruchanteile aus.
\begin{multicols}{4}
\begin{enumerate}[(a)]
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \angle in {45,90,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +45)*(2,0) +sin(\angle +45)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{1}{2}=\underline{\underset{}{\hspace{2cm}}}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \angle in {0,51.4285,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +51.4285)*(2,0) +sin(\angle +51.4285)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{25}{35}=\underline{\underset{}{\hspace{2cm}}}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \angle in {30,60,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +30)*(2,0) +sin(\angle +30)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{2}{3}=\underline{\underset{}{\hspace{2cm}}}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \angle in {0,21.1764,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +21.1764)*(2,0) +sin(\angle +21.1764)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{36}{51}=\underline{\underset{}{\hspace{2cm}}}$}};
\end{tikzpicture}
\end{enumerate}
\end{multicols}
\hspace{1cm}
Lösungen:
\begin{multicols}{4}
\begin{enumerate}[(a)]
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \i in {0,45,...,135}{
\fill[gray, opacity=0.5] (0,0) -- ($(0,0) + cos(\i)*(2,0) + sin(\i)*(0,2)$) -- ($(0,0) + cos(\i +45)*(2,0) +sin(\i +45)*(0,2)$) -- cycle;
}
\foreach \angle in {45,90,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +45)*(2,0) +sin(\angle +45)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{4}{8}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \i in {0,51.4285,...,205.7142}{
\fill[gray, opacity=0.5] (0,0) -- ($(0,0) + cos(\i)*(2,0) + sin(\i)*(0,2)$) -- ($(0,0) + cos(\i +51.4285)*(2,0) +sin(\i +51.4285)*(0,2)$) -- cycle;
}
\foreach \angle in {0,51.4285,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +51.4285)*(2,0) +sin(\angle +51.4285)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{5}{7}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \i in {0,30,...,210}{
\fill[gray, opacity=0.5] (0,0) -- ($(0,0) + cos(\i)*(2,0) + sin(\i)*(0,2)$) -- ($(0,0) + cos(\i +30)*(2,0) +sin(\i +30)*(0,2)$) -- cycle;
}
\foreach \angle in {30,60,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +30)*(2,0) +sin(\angle +30)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{8}{12}$}};
\end{tikzpicture}
\item \begin{tikzpicture}[scale=0.75, topline]
\foreach \i in {0,21.1764,...,232.9411}{
\fill[gray, opacity=0.5] (0,0) -- ($(0,0) + cos(\i)*(2,0) + sin(\i)*(0,2)$) -- ($(0,0) + cos(\i +21.1764)*(2,0) +sin(\i +21.1764)*(0,2)$) -- cycle;
}
\foreach \angle in {0,21.1764,...,360} {
\draw (0,0) -- ($(0,0) + cos(\angle)*(2,0) + sin(\angle)*(0,2)$) -- ($(0,0) + cos(\angle +21.1764)*(2,0) +sin(\angle +21.1764)*(0,2)$);
}
\draw node[below] at (0,-2) {\footnotesize{$\dfrac{12}{17}$}};
\end{tikzpicture}
\end{enumerate}
\end{multicols}
\end{document}
Wie man sieht mache ich oft das gleiche, welches ich gerne durch ein Kommando wie `nEck` für die Aufgabe bzw. auch `nEcksolution` für die Lösung abkürzen möchte. Bis jetzt habe ich die Winkel von den n-Ecken immer händisch in die foreach-Schleife gesetzt, was aber offensichtlich bei einem 7-Eck oder 17-Eck bzw. bei jedem anderem regelmäßigen n-Eck mit nicht ganzzahligen Winkeln anstrengend ist. Mir ist bekannt das die `counter`-Variablen Integerzahlen sind. Ich hatte sowas probiert wie `\setcounter{x}{\real{360.0/#1.0}}` in der Definition des Kommandos siehe oben, aber das wurde leider nicht kompiliert. Ich hatte auch andere Sachen versucht, was aber nie zum Erfolg führte. Deswegen die "misslungene" Variante oben im Beispiel. Mir ist durchaus bewusst wie TikZ denkt und warum bei dem Beispiel des 17-Eck oben 3 Grad zu den vollständigen 360 fehlen. Aber intuitiv dachte ich, dass es doch sicher eine Möglichkeit gibt die Rechnung "360/Anzahl der Ecken" zu runden bzw als real Zahl zu behandeln. Ich hoffe mein Problem ist nun etwas verständlicher.
PS: Ich möchte darauf hinweisen den freundlichen Ton hier Forum zu waren! Ich bin jederzeit bereit mir Tipps anzunehmen oder meine Frage nachzubessern. Mir ist leider nicht jede Bibliothek von TikZ bekannt aus der knapp 1300 Seiten langen Dokumentation. Ich bin auch kein Crack in TeX, sondern "nur" ein Lehrer der seine Unterrichtsunterlagen lieber mit LaTeX erstellt als mit Word. Ich würde mich also als fortgeschrittenen Anfänger bezeichnen. Aber mir ist z.B. klar, mit TikZ gibt es doch sicher nicht viel was nicht möglich ist. Deswegen wäre ich dankbar über jeden nett gemeinten Hinweis der mir weiter hilft.