
Quiero graficar una curva sobre el toro plano, pero no en todo el R^2
plano, sino en el cuadrado [0,1]x[0,1]
.
Para ello, he creado un "do... while" con sólo los datos iniciales de la pendiente racional. Esto es:
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)
Pido disculpas por los grandes errores en mi código. Acabo de escribir mi idea ya que no sé cómo hacerlo en LaTeX, usandoTikZPor ejemplo. ¿Cómo puedo hacerlo?
Ya lo hice manualmente, pero no es lo más óptimo. Se supone que intentar poner m=3/4
genera lo siguiente:
No quiero codificar donde tengo que trazar todo manualmente como el siguiente:
\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}
Respuesta1
Aquí tienes una opción. Definí un comando \flattorus
con tres argumentos:
- (opcional) El lado del cuadrado en la imagen de TikZ, en cm. Puse 4 como valor predeterminado, pero, por supuesto, puedes cambiarlo fácilmente.
- El número de columnas en las que se dividirá el cuadrado.
- El número de filas en las que se dividirá el cuadrado.
\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}
Respuesta2
@Vincent (+1) publicó una buena solución, pero ya estaba en proceso, así que pensé en publicarla como alternativa.
Aquí hay una macro \flattorus
que toma dos argumentos (y un argumento opcional adicional) para dibujar el toro plano. \flattorus[<scale factor>]{y}{x}
Dibuja la línea de pendiente y/x
sobre el toroide. La escala predeterminada es 2, lo que produce un cuadrado con una longitud de lado de 2 cm.
Por ejemplo, \flattorus{3}{4}\qquad\flattorus{5}{3}
produce:
y \flattorus[6]{10}{11}
produce
\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}
Respuesta3
Pruebe este código:
\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}
Producción: