Estudio de reflexiones en las espirales logarítmicas- archivo 1

Etiquetas: 

Este archivo muestra una primera aproximación al problema de las reflexiones en la espiral equiangular.

Desde un punto A se emite un rayo en dirección a B y se trata de encontrar el punto de impacto en la curva. En una siguiente fase estudiaremos otros archivos para obtener las siguientes reflexiones del rayo emitido y finalmente crearemos otro archivo para mostrar las curvas cáusticas reales (usando las reflexiones en el primer punto de impacto; las curvas cáusticas son las envolventes de la familia de rayos reflejados).

Al final de este artículo explicamos la forma en la que se ha diseñado este archivo con el programa Geogebra.

Explicaciones relacionadas con el diseño de este archivo:

Pasos iniciales: creación de la curva y de una secuencia de puntos sobre ella con arcos de la misma longitud

  • Creo un deslizador $\alpha$ y le asigno el valor $83^\circ$. Al final he tenido que ocultarlo y mantener ese valor fijo, porque al variar el archivo no funcionaba de la forma deseada (el ángulo representa el valor del ángulo formado por la tangente y el radio vector, que como es sabido es constante en estas espirales.
  • Defino la constante k a partir del ángulo $ k=\frac{1}{tan(\alpha)}$
  • Definimos la espiral como curva paramética: a = Curve[ℯ^(k t) cos(t), ℯ^(k t) sin(t), t, -2pi, 4 pi]
  • El siguiente objetivo es colocar puntos sobre la espiral para aproximarla como línea poligonal que llamaremos LineaPoligonalCurva (las intersecciones de semirrectas con líneas poligonales se calcula eficientemente, al contrario que las intersecciones de semirrectas con curvas paramétricas)
  • Esta aproximación se puede hacer de muchas maneras y los puntos que van a determinar la línea poligonal los colocaremos en la hoja de cálculo en la columna C ( empezando en la fila 2; por ejemplo se pueden poner parámetros desde -2 pi a 4 pi en la columna B y en la C calcular los puntos como C2 = a(B2), C3 = a(B3), etc. Lo malo de esto es que los puntos no quedan regularmente distribuidos sobre la curva; las longitudes de los arcos determinados por puntos sucesivos no son constantes y esto se puede conseguir en el caso de estas curvas de forma sencilla.
  • Para calcular la longitud del arco determinado por dos puntos de la curva correspondientes a los valores del parámetro $t_1$ y $t_2$ hay que caluclar $\int_{t_1}^{t_2}{\sqrt{x'(t)^2+y'(t)^2}}$. Es fácil comprogar que la integral anterior es igual a: $\frac{\sqrt{k ^2+1}}{k}(e^(kt_{2}) - e^(kt_{1}))$
  • Defino en Geogebra LongSeparac=0.3 que va a ser la longitud constante de los arcos determinados por una secuencia de puntos colocados sobre la curva
  • De $\frac{\sqrt{k ^2+1}}{k}(e^(kt_{2}) - e^(kt_{1}))=\text{LongSeparac}$ obtenemos $t_2 = \frac{1}{k} log(\frac{k}{\sqrt{k^2 + 1}}\text{LongSeparac}+e^{kt_1})$
  • Definimos cte = $\frac{k}{\sqrt{k^2 + 1}}$
  • El primer valor del paŕametro: $-2\pi$ lo colocamos en la celda B2 y el siguiente en la celda B3 : $\frac{1}{k} log(\text{cte * LongSeparac}+e^{kB2})$
    Copiamos y pegamos hacia abajo hasta llegar la valor aproximado $4 \pi$
  • En C2 escribimos a(B2) y obtenemos el punto de la curva (se llama a) que corresponde al parámetro colocado en B2.
    Copiamos y pegamos hacia abajo y tenemos una sucesión de puntos de la curva que determinan arcos de la misma longitud (LongSeparac)
  • Definimos la línea poligonal que aproxima la curva: LineaPoligonalCurva = PolyLine[C2:C266]
  • Defino un cuadrado grande como línea poligonal para contener la escena: ventana = PolyLine[(-100, -100), (100, -100), (100, 100), (-100, 100), (-100, -100)]

Hasta aquí hemos preparado las líneas generales del archivo (con ayuda de la hoja de cálculo).
Ahora vamos a diseñar una herramienta personalizada para lo siguiente: dados un punto emisor A y un punto B que marca la dirección de una semirrecta (rayo emitido), obtener el primer punto de intersección del rayo con la curva. Si no hay intersección con la curva, porque el rayo se "escapa" por la parte abierta de la espiral, devolverá el punto de intersección con la línea poligonal ventana.
Veamos los pasos:

Diseño de la herramienta personalizada

  • Creo dos puntos libres: A y B
  • Creo la semirrecta de origen A y punto B: b = Ray[A, B] (usando GG en inglés)
  • Creo una lista con los puntos de intersección de esa semirrecta con la lína poligonal que aproxima la curva: Intersecciones = {Intersect[b, LineaPoligonalCurva]} (La lista ordena los puntos de intersección en orden creciente de separación de su origen, primero los más cercanos al origen y después los más alejados; si no hay intersección debido a la posición concreta de A y de B, la lista tomará el valor: Intersecciones = {(?,?)}. Para poder tratar este caso calculamos también:
  • la lista formada por el punto de intersección de la semirrecta con el borde poligonal cuadrado que hemos definido antes: InterseccionBordeVentana = {Intersect[b, ventana]}
  • Defino ahora el punto que quiero que devuelva la herramienta personalizada que voy a crear:
    P = If[ abs(x(A)) == 100 || abs(y(A)) == 100 || A==B, A, If[IsDefined[Element[Intersecciones, 1]] == false, Element[InterseccionBordeVentana, 1], If[Element[Intersecciones,1] != A, Element[Intersecciones,1], If[IsDefined[Element[Intersecciones,2]] == true, Element[Intersecciones,2], Element[InterseccionBordeVentana,1] ]]]]

    Explicación de la definición de P:

    • Si A está en el borde (línea poligonal ventana) el punto de impacto será A, es decir en realidad no buscamos ningún impacto nuevo y el borde absorberá todas las posibles "emisiones de rayos" desde él (esto se debe a que más adelante nos van a interesar trayectorias sucesivas, no solo una como es el caso en este diseño que nos ocupa; esto puede ser complicado de entender a la primera y de hecho lo he diseñado así en una reimplementación del asunto debido a errores en mi primera aproximación; esto significa que desde el borde no se pueden disparar rayos),
    • Si el primer punto de intersección A coincide con el punto B que marca la dirección del rayo, el punto de impacto P no se puede calcular y le asignaremos el valor común A
    • En el segundo IF (anidado en el primero) asignamos a P el punto de impacto en el borde en aquellos casos en los que el rayo no tiene intersecciones con la curva.
    • En el tercer IF analizamos lo que puede suceder cuando sí existen intersecciones con la curva y si el programa llega hasta aquí es porque no se dan las condiciones booleanas que ya hemos considerado hasta ahora
    • En estas circunstancias si el primer elemento de la lista de puntos de intersección con la curva es distinto de A, el valor buscado es A y será el valor asignado a P
    • Si el primer punto de intersección con la curva es A y existe un segundo punto de intersección, ese segundo punto es el buscado y el que asignamos a P
    • Y por último, si el programa llega hasta aquí es porque hay intersecciones con la curva, A es el primer punto de corte y no hay más puntos de corte, en cuyo caso P será el punto de corte del rayo con el borde
  • Ahora creamos la herramienta personalizada cuyo objeto final es el punto llamado P y cuyos elementos iniciales son: A, B, LongSeparac, α,B2, ventana, asignamos un nombre, por ejemplo Impacto y tarea finalizada
  • Al escribir en la barra de entrada o en una celda de la hoja de cálculo Impacto[R, S, LongSeparac, α,B2, ventana] calcula el siguiente punto de intersección (y si no existe asigna el punto de intersección con el marco exterior que hemos definido. Si R y S coinciden le asigna ese punto común y si el punto emisor está en el borde le asigna el mismo punto emisor

En el próximo artículo hemos diseñado una nueva herramienta adicional, que permite visualizar sucesivas reflexiones al disparar un rayo en dirección a la esprial.

Añadir nuevo comentario