Tikz 曲线

Tikz 曲线

我怎样才能在 Tikz 中绘制这条曲线

\begin{gather*}
x(t)=
\begin{cases}
  2(t-n+1),   & t\in [n-1,n-1/2] \\
  2-2(t-n+1), & t\in [n-1/2, n]
\end{cases}
\\
y (t)=
\begin{cases}
2(\sqrt{2}t-n+1),   & \sqrt{2}t\in [n-1,n-1/2] \\
2-2(\sqrt{2}t-n+1), & \sqrt{2}t\in [n-1/2, n]
\end{cases}
\end{gather*}
with $n\in \mathbb{N}$

示例输出的图片

答案1

首先,您可以用更简单的方式编写函数,如下所示: 在此处输入图片描述

这是斜率为 的单位正方形内的台球轨迹1:sqrt(2)

方法 I您可以使用库定义此函数math并将其作为常规函数进行绘制。问题是您需要大量样本(因此编译速度很慢)才能获得可用的东西(这里我使用了 700 个!)。

\documentclass[border=7mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\tikzmath{
  function x(\t){
    int \n; \n=int(\t);
    if (\t - \n) < .5 then{
      return 2*(\t-\n);
    }
    else {
      return 2*(1+\n-\t);
    };
  };
  function y(\t){
    return x(1.41421356237*\t);
  };
}
\begin{tikzpicture}[scale=3]
  \draw[thick] plot[domain=0:5,variable=\u,samples=700] ({x(\u)},{y(\u)});
\end{tikzpicture}
\end{document}

在此处输入图片描述

方法 II您可以计算所有反弹的位置并在其间画出直线。

\documentclass[varwidth,border=7mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
  \begin{tikzpicture}[scale=3]
      \tikzmath{
        % initial value, max value, next bounce value, speed
        \x = 0; \maxx=1; \bx=\maxx; \dx = 1;
        \y = 0; \maxy=1; \by=\maxy; \dy = 1.41421356237;
        for \i in {0,...,35}{
          % save values
          \sx = \x; \sy = \y;
          % time to next bounce
          \tx = (\bx-\x)/\dx;
          \ty = (\by-\y)/\dy;
          if \tx < \ty then { % if bounce on x before y
            \x = \bx;
            \bx = \maxx-\x;
            \dx = -\dx;
            \y = \y + \tx*\dy;
          } else { % if bounce on y before x
            \y = \by;
            \by = \maxy-\y;
            \dy = -\dy;
            \x = \x + \ty*\dx;
          };
          {\draw (\sx,\sy) -- (\x,\y);};
        }; % end for
      };
  \end{tikzpicture}
\end{document}

在此处输入图片描述

这种方法更快,你可以做很多反弹。例如,如果你这样做for \i in {0,...,300},你就会获得

在此处输入图片描述

你可以自定义这个台球轨迹:

  • 通过修改\maxx\maxy您可以用任意矩形替换单位正方形。
  • 通过修改\dx\dy您可以获得任意斜率(初速度)。
  • 通过修改\x\y您可以获得任意初始位置。

练习:您可以修改代码来获得此结果: 在此处输入图片描述

相关内容