Zoom: el algoritmo de los puntos de fuga

Un punto de fuga, en un sistema de proyección cónica, es un lugar geométrico en el cual convergen las proyecciones de las rectas paralelas a una dirección dada en el espacio, no paralelas al plano de proyección. 
— Definición según Wikipedia

Puntos de fuga y el algoritmo para hacer zoom

Obra con puntos de fuga: Entrega de las llaves a San Pedro (Perugino)

Hace tiempo me vino una pregunta a la cabeza: ¿cómo funcionan los puntos de fuga? Me refiero a cómo funcionan  matemáticamente.

Sí, soy así de rarito. Cada uno con lo suyo, ¿ok?

Pues a raíz de esa pregunta, me pasé una tarde de domingo haciendo cálculos, como un científico loco, hasta que encontré un método matemático, una fórmula, para conseguir un punto de fuga.

Sí, lo sé, podría haber buscado la solución en internet, pero eso le hubiera restado emoción. ¡Disfruta del camino más que del destino!

Al terminar, me hice otra pregunta: ¿y ahora qué?

¡Qué triste dejar el tema ahí, en unos garabatos sobre cuatro hojas que iban a desaparecer tarde o temprano (de hecho, ya deben haber acabado en la basura)!

Así que me dispuse a crear un sencillo algoritmo con lo que había "descubierto".

Zoom Algorithm

Código fuente en GitHub: https://github.com/ricard-ferrero/zoom-algorithm

Zoom Algorithm es una aplicación en la que puedes hacer zoom-in y zoom-out sobre una imagen que tiene tres rectangulos, escogiendo con el ratón el punto de fuga sobre el que hacer zoom.

Está hecho en Python y los gráficos se renderizan con Pygame.

No es nada pretencioso. Tan solo quería comprobar que funcionaba lo que había deducido.

La teoría

Imagina una figura geometrica sencilla, como un rectángulo.

Ahora, imagina un punto fijo en algún lugar cerca del rectángulo. Le llamaremos "punto de fuga".

Por último, imagina cuatro líneas rectas que emergen del punto de fuga y que cada una de ellas pasa por encima de cada uno de los vértices (ángulos) del rectángulo.

Con esto ya tenemos todo lo que necesitamos.

A partir de aquí, podemos conseguir efecto de profunidad creando más rectángulos en los que sus vértices también pasen por las rectas.

Si queremos un rectángulo más lejos, deberá tener un tamaño menor, y por lo tanto estará más cerca del punto de fuga.

Por otro lado, si queremos tener un rectángulo más cerca del espectador, necesitamos que tenga un tamaño mayor, es decir, que esté más lejos del punto de fuga.

Para hacer zoom sería lo mismo: deberíamos desplazar el rectángulo por las rectas, volviendolo pequeño cuando lo alejamos de nosotros (zoom-out), o grande si lo acercamos (zoom-in).

Entonces, matemáticamente lo que sucede es que el desplazamiento en las líneas debe ser proporcional entre ellas.

Supongamos que hacemos zoom-in, que en el ejemplo sería desplazar el rectángulo a la derecha y volverlo mayor.

Si lo hacemos un tercio mayor, deberemos calcular la distancia de cada recta desde el punto de fuga hasta el vértice, y correr ese vértice un tercio de la distancia medida.


Y, básicamente, eso es lo que he aplicado al algoritmo de la aplicación.

Cada vez que haces zoom, calcula la distancia que hay entre el cursor (mouse) y los vértices de los tres rectángulos, y a partir de allí deforma los rectángulos para que haga el efecto de que nos acercamos o alejamos.

Comentarios

Entradas populares de este blog

¿Terminal o Shell? Qué son y en qué se diferencian

Café con Bits 7 ☕ Motivación: hacer un videojuego