First thing first : you can probably write your function in a simpler way like this :
This is a billiard trajectory in a unit square with slope 1:sqrt(2)
.
Method I You can define this function using math
library and plot it as usual function. The problem is that you need a big number of samples (so the compilation is slow) to obtain something usable (here I use 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}
Method II you can calculate the positions of all bounces and draw straight lines in between.
\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}
This method is faster and you can do a lot of bounces. For example if you do for \i in {0,...,300}
than you obtain
You can customize this billiard trajectory:
- By modifying
\maxx
and \maxy
you can replace the unit square with arbitrary rectangle.
- By modifying
\dx
and \dy
you can obtain arbitrary slope (initial velocity).
- By modifying
\x
and \y
you can obtain arbitrary initial position.
Exercice : You can adapt the code to obtain this :