Нарисуйте плоский тор

Нарисуйте плоский тор

Я хочу построить график кривой на плоском торе, но не на всей R^2плоскости, а на квадрате [0,1]x[0,1].

Для этого я создал "do...while" только с начальными данными рационального наклона. Это:

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)

Я извиняюсь за большие ошибки в моем коде. Я просто написал свою идею, так как я не знаю, как это сделать в LaTeX, используяТикЗнапример. Как мне это сделать?

Я уже сделал это вручную, но это не самый оптимальный вариант. Попытка поставить m=3/4должна вывести следующее:

Введите описание изображения здесь

Я не хочу писать код, в котором мне придется все чертить вручную, как в следующем примере:

\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}

решение1

Вот вариант. Я определил команду \flattorusс тремя аргументами:

  1. (необязательно) Сторона квадрата на картинке TikZ в см. Я установил значение 4 в качестве значения по умолчанию, но, конечно, вы можете легко его изменить.
  2. Количество столбцов, на которые нужно разбить квадрат.
  3. Количество строк, на которые нужно разбить квадрат.
\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}

решение2

Хорошее решение было опубликовано @Vincent (+1), но оно уже было в разработке, поэтому я решил опубликовать его в качестве альтернативы.

Вот макрос \flattorus, который принимает два аргумента (и один дополнительный необязательный аргумент) для рисования плоского тора. \flattorus[<scale factor>]{y}{x}рисует линию наклона y/xна торе. Масштаб по умолчанию равен 2, что дает квадрат со стороной 2 см.

Например, \flattorus{3}{4}\qquad\flattorus{5}{3}производит:

введите описание изображения здесь

И \flattorus[6]{10}{11}производит

введите описание изображения здесь

\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}

решение3

Попробуйте этот код:

\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}

Выход:

введите описание изображения здесь

Связанный контент