Por fin he tenido tiempo para hacer algo de codificación y puedo generar sus imágenes en el ordenador. La matemática es bastante simple. La columna vertebral de la simulación de dos funciones
- Ray & plano de intersección: Vamos a tener ray $\mathbf r(t) = \mathbf v t + \mathbf p$ ( $\mathbf v$ la dirección de ray(no es necesario vector unitario), $\mathbf p$ punto de inicio de rayos), y el plano $ \mathbf n \cdot \mathbf x - \mathbf n \cdot \mathbf d = 0$ ($\mathbf n$ es la unidad de lo normal, y $\mathbf d$ es cualquier punto en el plano). Que el punto de Intersección de este rayo y el plano es el punto
$$
\mathbf v \frac{ \mathbf n \cdot \mathbf d - \mathbf n \cdot \mathbf p}{\mathbf n \cdot \mathbf v} + \mathbf p
$$
- Ray rebote del avión. Tenemos que calcular cómo es la dirección de ray cambios cuando se rebota de avión. Si la dirección de ray es $\mathbf v$ y el plano de la unidad normal es $\mathbf n$ que la nueva dirección de los rayos después de un golpe
$$
\mathbf v - 2 \mathbf n ( \mathbf n \cdot \mathbf v)$$
He implementado estos dos función a Mathematica y los utilizó para generar imágenes similares como en tu video. Sigue aquí el código. Espero que sea bien comentada, así que es comprensible. (Para una mejor legibilidad de copiar y pegar el código de mathematica o incluso mejor que descargar el archivo de bloc de notas)
(*
starting direction of ray
*)
v0 = {0, 1, 0}; p0 = {0, -3, 0};
(*
parameters of first plane
w1 - rotation axis
n1 - starting normal of plane
d1 - this is fixed point of plane, it stays still when plane rotates
omega1 - angular velocity of plane
*)
w1 = {1, -1, 0}; n1 = {1.1, -1, 0}; d1 = {0, 0, 0}; omega1 = 2;
w1 = w1/Norm[w1]; n1 = n1/
Norm[n1] ; (* here I just make sure that w1 and n1 are unit vectors *)
\
(* h
parameters of second plane
*)
w2 = {-1, 1, 0}; n2 = {-1.3, 1, 0}; d2 = {2, 0, 0}; omega2 = 1;
w2 = w2/Norm[w2]; n2 = n2/
Norm[n2] ; (* here I just make sure that w2 and n2 are unit vectors \
*)
(*
parameters of plane on which I project final image
*)
n3 = {0, 1, 0}; d3 = {0, 5, 0};
(*
Auxiliary function which make rotation matrix from axis and angle
*)
RotationMatrixFromAxis[n_, angle_] := MatrixExp[angle ( {
{0, -n[[3]], n[[2]]},
{n[[3]], 0, -n[[1]]},
{-n[[2]], n[[1]], 0}
} )];
(* Calculates ray plane intersecion
v - direcation of ray
p - start point of ray
n - normal of plane, has to be unit vector
d - distance of plane from origin
*)
RayPlaneHit[v_, p_ , n_, d_] :=
v (Dot[n, d] - Dot[n, p])/Dot[n, v] + p;
(* Calculate direction of ray which bounces of the plane
v - direction of ray
n - normal of plane
*)
RayPlaneBounce[ v_, n_ ] := v - 2 n (Dot[n, v]);
(*
Calculate normals of rotating planes at time `t`
*)
n1 = RotationMatrixFromAxis[w1, t omega1].n1;
n2 = RotationMatrixFromAxis[w2, t omega2].n2;
(*
Calculate ray intersection and direction after it hit the first \
plane
*)
p1 = RayPlaneHit[v0, p0, n1, d1];
v1 = RayPlaneBounce[ v0, n1];
(*
Calculate ray intersection and direction after it hit the secont \
plane
*)
p2 = RayPlaneHit[v1, p1, n2, d2];
v2 = RayPlaneBounce[ v1, n2 ];
(*
Calculate ray intersection after it hit the third plane
*)
p3 = \!\(\*
TagBox[
RowBox[{"Simplify", "[",
RowBox[{"RayPlaneHit", "[",
RowBox[{"v2", ",", "p2", ",", "n3", ",", "d3"}], "]"}], "]"}],
CheckAbort[#,
Defer[#]]& ]\);
(*
Since third plane is perpendicular to y-axis, plot only x,z \
components of final intersection
*)
ParametricPlot[ {p3[[1]], p3[[3]]}, {t, 0, 10}]
Aquí están algunas de las imágenes que genera.
Para responder a la pregunta original, que le preguntó: ¿es Rosa, la curva de Lissajous o hypotrochoid?, usted tendría que probablemente alinear correctamente el último plano en el que el proyecto, por lo que la expresión final no sería tan complicado. No he descubierto cómo hacerlo todavía.