Tienes varios problemas que resolver cada vez que el rayo se refleja.
Me gusta utilizar vectores para resolver problemas como éste. Todos los vectores de este problema tienen sólo dos coordenadas. Tendrás que saber cómo sumar dos vectores, cómo restar un vector de otro, cómo tomar el producto escalar de un número y un vector, y cómo tomar el producto interior (también llamado "producto punto") de dos vectores. Es decir, si $u = (u_x, u_y)$ y $v = (v_x, v_y)$ son dos vectores y $r$ es un número, \begin{align} u + v &= (u_x + v_x, u_y + v_y), \\ u - v &= (u_x - v_x, u_y - v_y), \\ rv &= (rv_x, rv_y), \\ u \cdot v &= u_x v_x + u_y v_y. \end{align}
Encuentre el lugar en el que el haz de luz podría intersecar un determinado espejo
Supongo que se le da el punto de partida $p = (p_x,p_y)$ y un vector de dirección $v = (v_x, v_y)$ para el rayo de luz. (Basado en su archivo de entrada y el diagrama, $p_x,p_y,v_x,v_y,$ en ese orden, parecen ser los cuatro números de la primera línea de la entrada).
Construir otro vector $w$ perpendicular a $v.$ Una forma de hacerlo es intercambiar el $x$ y $y$ coordenadas y luego cambiar el signo de una coordenada; por ejemplo, puedes poner $w = (-v_y,v_x).$
También trataremos las posiciones como vectores. Puedes pensar en un "vector de posición" como el vector que da la distancia y la dirección desde $(0,0)$ a un punto, o puede tratar las coordenadas del punto como si fueran coordenadas de un vector.
Dado un espejo con puntos extremos en $a = (a_x,a_y)$ y $b = (b_x,b_y),$ construir los vectores que muestran la distancia y la dirección desde el punto de partida del rayo de luz hasta los puntos finales de los espejos. Estos vectores son las diferencias vectoriales $a - p$ y $b - p.$
Tomar el producto punto de cada uno de los dos últimos vectores con el vector $w$ : \begin{align} r_a &= (a - p) \cdot w, \\ r_b &= (b - p) \cdot w. \end{align} Si los signos de $r_a$ y $r_b$ son iguales (ambos positivos o ambos negativos), el rayo de luz no puede se cruzan con el espejo.
Si los signos de $r_a$ y $r_b$ son opuestos (uno es positivo y otro negativo), entonces el rayo de luz puede se reflejan en el espejo. Hay varias formas de intentar averiguar si realmente se refleja, pero también puedes usar el método que calcula el posible punto de intersección.
El punto de reflexión, es decir, el punto en el que el rayo de luz chocaría con el espejo (si es que lo hace) está en el vector de posición $$ p' = \left(\frac{r_b}{r_b - r_a}\right) a - \left(\frac{r_a}{r_b - r_a} \right) b. $$ La distancia y la dirección de $p'$ de $p$ es $p' - p.$ Tomar el producto punto de esto con el vector de dirección del rayo de luz: $$ d = (p' - p) \cdot v. $$ El número $d$ es una especie de medida de la distancia del punto de reflexión desde el punto de partida del rayo de luz. Si es positivo, el rayo de luz va hacia el espejo; si es negativo, el rayo de luz se aleja del espejo.
Determina en qué espejo se refleja el haz de luz
Para cada espejo, sigue el procedimiento para encontrar el punto de intersección del haz de luz. Ignora el espejo si encuentras que $r_a$ y $r_b$ tienen el mismo signo o si $d$ es negativo. El espejo con el menor valor positivo de $d$ es la que reflejará el rayo de luz.
Por supuesto, si no encuentra ningún espejo con un valor positivo de $d,$ no hay reflexión.
Construir el haz de luz reflejado
Ahora tienes un nuevo punto de partida para el rayo de luz reflejado: es el vector de posición $p'$ donde el rayo de luz entrante se cruzó con el espejo.
Una forma de encontrar la dirección del rayo reflejado es la siguiente. Dados los puntos extremos del espejo, $a$ y $b,$ construir un vector $m= (m_x, m_y)$ que da la dirección y la longitud de la superficie del espejo: $$ m = b - a. $$ Construir un segundo vector $n = (n_x, n_y)$ perpendicular (normal) al espejo: $$ n = (-m_y, m_x). $$ Tome el producto punto de cada uno de estos vectores con el vector $v,$ dividido por el producto punto de $m$ con él mismo; esto te da un número por el que se multiplica cada vector para obtener dos nuevos vectores, así: \begin{align} m' &= \left(\frac{v \cdot m}{m\cdot m}\right) m, \\ n' &= \left(\frac{v \cdot n}{m\cdot m}\right) n. \end{align} (Puede utilizar $n\cdot n$ en lugar de $m\cdot m$ si quieres; son el mismo número).
Los vectores $m'$ y $n'$ son componentes del vector $v$ paralelo al espejo y perpendicular a él. Es decir, se suman al vector original: $v = m' + n'.$ Para obtener la dirección del rayo reflejado, se invierte la componente de la dirección del rayo de luz que es perpendicular al espejo: el nuevo vector de dirección es $$ v' = m' - n'.$$
Ahora tienes una posición de partida $p'$ y una dirección $v'$ del rayo reflejado; repite el procedimiento desde el paso "encuentra dónde el rayo de luz podría intersecar un espejo particular" hasta que no haya más reflexiones.
En el procedimiento anterior, he tratado de describir lo que es cada nueva posición o vector para que cuando estés depurando tu programa, puedas comprobar los pasos uno a uno para verificar que están produciendo los resultados que deberían. Si hay un error en mi explicación o un error en tu implementación del mismo, podrás identificar exactamente qué parte del algoritmo estaba mal.
0 votos
Viendo tu figura, imagino que trabajas con Matlab ? Lo pregunto porque algunas cosas son más "transmisibles" a través de un lenguaje de programación común...
0 votos
Trabajo con c++, pero el lenguaje de programación creo que no tiene importancia