He escrito el guión que hizo estas imágenes hace varios días, los segmentos representan cada uno un rayo de luz, como la luz golpea el límite de la elipse, es reflejada por la elipse de acuerdo con las leyes de la reflexión, y el rayo de luz reflejado es de nuevo reflejado por la elipse, y la reflexión de la reflexión es de nuevo reflejada por la elipse...
La luz sigue rebotando de un lado a otro, una y otra vez, hasta que la luz se ha reflejado un determinado número de veces.
Paso a paso sobre cómo hice estas imágenes.
Primero, se hace una elipse.
$\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$
La ecuación anterior describe los puntos de la elipse, también es el límite de la elipse. (Supongamos que la elipse es horizontal).
Construir un triángulo rectángulo a partir de un semieje menor y un semieje mayor, siendo el ángulo agudo adyacente al semieje mayor $\alpha$ entonces la relación entre a, b y $\alpha$ se puede escribir como:
$b = a \cdot tan(\alpha)$
Reescribe la ecuación de la elipse:
$\frac{x^2}{a^2} + \frac{y^2}{a^2 \cdot tan(\alpha)^2} = 1$
Elige un punto al azar dentro de la elipse, para todos los puntos dentro de la elipse, simplemente usa esta ecuación:
$\frac{x^2}{a^2} + \frac{y^2}{b^2} <= 1$
Entonces el punto aleatorio está dado como
$(a \cdot cos(\alpha) \cdot m, b \cdot sin(\alpha) \cdot n)$
Donde $\alpha$ está en el rango $[0, 2\pi]$ y m, n están en el rango $[0, 1]$ .
Entonces elige un ángulo al azar $\beta$ para construir una línea que pase por el punto elegido con un ángulo $\beta$ con el eje x.
Utilizo la forma de intersección de pendientes de la ecuación de la línea ( $y = k \cdot x + c$ ):
Sea el punto elegido $(x_0, y_0)$ , entonces la ecuación del rayo incidente es:
$y = tan(\beta) \cdot x + y_0 - x_0 \cdot tan(\beta)$
Pero si $\beta$ es un múltiplo de $\frac{\pi} {2}$ las cosas se complican, porque tan(0) = 0 y $tan(\frac{\pi} {2})$ es indefinido.
Así que uso $y = y_0$ si la línea es paralela al eje x y $x = x_0$ si la línea es perpendicular al eje x.
Ahora hay que calcular las intersecciones entre el rayo incidente y la elipse.
Si:
$c^2 < a^2 \cdot k^2 + b^2$
Entonces puede haber dos intersecciones $(x_0, y_0)$ y $(x_1, y_1)$ .
$$\begin{align} n_1 &= a^2 \cdot k^2 + b^2 \\ n_2 &= 2 \cdot a^2 \cdot k \cdot c \\ n_3 &= a^2 \cdot (c^2 - b^2) \\ n_4 &= \sqrt{(n_2^2 - 4 \cdot n_1 \cdot n_3)} \\ x_0 &= \frac{(-n_2 + n_4)} {(2 \cdot n_1)} \\ x_1 &= \frac{(-n_2 - n_4)} {(2 \cdot n_1)} \\ y_0 &= k \cdot x_0 + c \\ y_1 &= k \cdot x_1 + c \end{align}$$
Para líneas como $x = x_0$ y $y = y_0$ sin embargo:
Primer set:
Si $abs(x_0) <= a$
$y_0 = \sqrt{b^2 - x_0^2 \cdot \frac{b^2} {a^2}}$
Las intersecciones son $(x_0, +y_0)$ y $(x_0, -y_0)$ .
Segundo set:
Si $abs(y_0) <= b$
$x_0 = \sqrt{a^2 - y_0^2 \cdot \frac{a^2} {b^2}}$
Las intersecciones son $(+x_0, y_0)$ y $(-x_0, y_0)$
A continuación, elija la intersección para realizar más cálculos, para $\beta$ en el rango $[0, \frac{\pi} {2}]$ y $[\frac{3 \pi} {2}, 2 \pi]$ Elijo la intersección de la derecha, si no, elijo la de la izquierda.
Luego calculo la tangente de la elipse en la intersección.
Para un punto $(x_0, y_0)$ en la elipse dada por a, b, la pendiente k de la recta tangente a la elipse en ese punto debe satisfacer:
$k = \frac{-x_0 \cdot b^2} {a^2 \cdot y_0}$
Entonces para casi todas las líneas, la ecuación de la línea tangencial es:
$y = k \cdot x + \frac{b^2} {y_0}$
Pero si arctan(k) es un múltiplo de $\frac{\pi} {2}$ la relación anterior se rompe y en su lugar vuelvo a la forma constante.
Luego calculo la normal (línea perpendicular a esa tangente que pasa por esa intersección):
$y = \frac{-x} {k} + y_0 - \frac{-x_0} {k}$
Donde $(x_0, y_0)$ es la intersección, y k es la pendiente de la normal.
Pero de nuevo la relación anterior se rompe si la línea es especial. No mostraré aquí cómo trato las excepciones, ya he mostrado demasiadas ecuaciones, puedes ver todos los cálculos en el código.
Luego calculo el ángulo con signo formado por el rayo incidente y la normal:
Dejemos que $k_1$ sea la pendiente del rayo incidente, y que $k_2$ sea la pendiente de la normal:
$$\begin{align} \alpha_1 &= atan(k_1) \\ \alpha_2 &= atan(k_2) \\ \alpha_\delta &= \alpha_2 - \alpha_1 \\ \alpha_\delta &= (\alpha_\delta + \pi) \bmod 2 \pi - \pi \end{align}$$
De nuevo, lo anterior no funciona si alguna de estas líneas es especial, se requieren otros cálculos.
Luego calculo el rayo reflejado, simplemente girando la línea normal sobre la intersección por $\alpha_\delta$ (suponiendo que los cálculos anteriores hayan tenido éxito):
$$\begin{align} \alpha_3 &= \alpha_2 + \alpha_\delta \\ y &= tan(\alpha_3) \cdot x + y_0 - tan(\alpha_3) \cdot x_0 \end{align}$$
Luego calculé las intersecciones entre el rayo reflejado y la elipse, habrá dos intersecciones, esta vez la intersección que se necesita es la otra intersección desde la actual.
A continuación, todos los cálculos anteriores se repiten de forma recursiva, hasta alcanzar un determinado número de iteraciones.
¿Cómo simplificar todos los cálculos implicados y calcular el rayo reflejado en el menor número de pasos posible, incluyendo todos los casos límite?
Lo quiero así: dada la coordenada de un punto y un ángulo, calcular la intersección del rayo con la elipse, y luego calcular la tangente de la elipse en esa intersección, luego calcular el rayo reflejado, todo esto en el menor número de pasos posible, utilizando un conjunto de ecuaciones sin excepciones. Preferiblemente, el número de ecuaciones involucradas debe ser menor o igual a seis.