答案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
您可以获得任意初始位置。