
Ich möchte eine Kurve auf dem flachen Torus grafisch darstellen, jedoch nicht auf der gesamten R^2
Ebene, sondern auf dem Quadrat [0,1]x[0,1]
.
Dazu habe ich ein „do...while“ mit nur den Anfangsdaten der rationalen Steigung erstellt. Das ist:
let m=p/q
let fx(u)=m(1-u) and fy(u)=(1-u)/m
x=0
DO
y=fx(x)
draw (x,0) -- (1,y);
x=fy(y)
draw (0,y) -- (x,1);
WHILE (x=1)
Ich entschuldige mich für die großen Fehler in meinem Code. Ich habe meine Idee einfach niedergeschrieben, da ich nicht weiß, wie man es in LaTeX macht, und zwar mitTikZbeispielsweise. Wie kann ich das machen?
Ich habe es bereits manuell gemacht, aber es ist nicht optimal. Der Versuch, Folgendes einzugeben, m=3/4
sollte folgendes ausgeben:
Ich möchte keinen Code schreiben, bei dem ich alles manuell darstellen muss, wie etwa den folgenden:
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[red] (0,0) -- (1,3/4);
\draw[red] (0,3/4) -- (1/3,1);
\draw[red] (1/3,0) -- (1,1/2);
\draw[red] (0,1/2) -- (2/3,1);
\draw[red] (2/3,0) -- (1,1/4);
\draw[red] (0,1/4) -- (1,1);
\draw (0,0) -- (1,0) -- (1,1) -- (0,1) -- (0,0) -- (1,0);
\end{tikzpicture}
\end{document}
Antwort1
Hier ist eine Option. Ich habe einen Befehl \flattorus
mit drei Argumenten definiert:
- (optional) Die Seite des Quadrats im TikZ-Bild in cm. Ich habe 4 als Standardwert eingegeben, aber das können Sie natürlich leicht ändern.
- Die Anzahl der Spalten, in die das Quadrat aufgeteilt werden soll.
- Die Anzahl der Zeilen, in die das Quadrat aufgeteilt werden soll.
\documentclass{article}
\usepackage{tikz}
\newcounter{mx}
\newcounter{my}
\newlength{\squareside}
\newcommand*{\flattorus}[3][4]{%
\setcounter{mx}{#2}
\setcounter{my}{#3}
\addtocounter{mx}{-1}
\addtocounter{my}{-1}
\setlength{\squareside}{#1 cm}
\begin{tikzpicture}[x=\dimexpr\squareside/#2, y=\dimexpr\squareside/#3]
\draw[thick] (0,0) rectangle (#2,#3);
\foreach \x in {0, ..., \value{mx}}
\foreach \y in {0, ..., \value{my}}{
\draw (\x,\y) -- ++(0,1);
\draw (\x,\y) -- ++(1,0);
\draw[red, thick] (\x,\y) -- ++(1,1);
};
\node[below left] at (0,0) {0};
\node[below] at (#2,0) {1};
\node[left] at (0,#3) {1};
\foreach \x in {1, ..., \value{mx}}
\node[below] at (\x,0) {\x/#2};
\foreach \y in {1, ..., \value{my}}
\node[left] at (0,\y) {\y/#3};
\end{tikzpicture}
}
\begin{document}
\flattorus{3}{4}
\flattorus{5}{2}
\flattorus[2]{2}{3}
\end{document}
Antwort2
@Vincent (+1) hat eine nette Lösung gepostet, aber daran war bereits gearbeitet, deshalb dachte ich, ich poste sie als Alternative.
Hier ist ein Makro \flattorus
, das zwei Argumente (und ein zusätzliches optionales Argument) benötigt, um den flachen Torus zu zeichnen. \flattorus[<scale factor>]{y}{x}
zeichnet die Steigungslinie y/x
auf dem Torus. Der Standardmaßstab ist 2, wodurch ein Quadrat mit einer Seitenlänge von 2 cm entsteht.
Beispielsweise \flattorus{3}{4}\qquad\flattorus{5}{3}
erzeugt:
Und \flattorus[6]{10}{11}
produziert
\documentclass{article}
\usepackage{tikz}
\newcommand{\flattorus}[3][2]{\begin{tikzpicture}[scale=#1]
\foreach \k[evaluate=\k as \j using int(\k-1)] in {2,...,#2}{
\draw[gray!30] ({(\j)/#2},0)node[black, below]{$\frac{\j}{#2}$}--++(0,1);}
\foreach \k[evaluate=\k as \j using int(\k-1), evaluate=\k as \p using #2*#3] in {2,...,#3}{\xdef\xy{\p}
\draw[gray!30] (0,{(\j)/#3})node[black, left]{$^{\j}\!/\!_{#3}$}--++(1,0);}
\foreach \k[evaluate=\k as \j using int(\k-1), evaluate=\k as \x using frac(\k*#3/\xy), evaluate=\k as \y using frac(\k*#2/\xy)] in {1,...,\xy}{
\draw[red, thick]({frac(\j*#3/\xy)},{frac(\j*#2/\xy)})--({\x+less(\x,1/\xy)},{\y+less(\y,1/\xy)});}
\draw (0,0)node[below left]{0}--(1,0)node[below]{1}--(1,1)--(0,1)node[left]{1}--cycle;
\end{tikzpicture}}
\begin{document}
\flattorus{3}{4}\qquad\flattorus{5}{3}
\flattorus[6]{10}{11}
\end{document}
Antwort3
Versuchen Sie diesen Code:
\documentclass[10pt,a4paper]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=10]
\draw[gray!30,xstep=.3333,ystep=.25] (0,0) grid (1,1);
\draw[red,line width=2pt] (0,0) -- (1,3/4);
\draw[red,line width=2pt] (0,3/4) -- (1/3,1);
\draw[red,line width=2pt] (1/3,0) -- (1,1/2);
\draw[red,line width=2pt] (0,1/2) -- (2/3,1);
\draw[red,line width=2pt] (2/3,0) -- (1,1/4);
\draw[red,line width=2pt] (0,1/4) -- (1,1);
\foreach \x in {0,1/3,2/3,1}
\draw (\x,.02)--(\x,-.02) node[below] {\bfseries $\x$};
\foreach \y in {0,1/4,1/2,3/4,1}
\draw (.02,\y)--(-.02,\y) node[left] {\bfseries $\y$};
\end{tikzpicture}
\end{document}
Ausgabe: