domingo, 21 de enero de 2024

Plegando papel con R

En 'Digital map folding part 1: 2D' encontramos un tutorial para emular el plegado en papel de un mapa (aplicable a cualquier cosa susceptible de ser impresa). El proceso es laborioso y no parametrizable, fruto de usar un programa no pensado para ello, pero la idea es buena y fácilmente programable así que vamos a replicarla con R. La automatizaremos para un número arbitrario de pliegues por eje.

Empezamos estudiando la forma en que se nos revelan los pliegues en un folio real cuando sobre él incide luz desde cierto ángulo. En concreto aplicamos un pliegue longitudinal en vertical más tres pliegues tipo acordeón en horizontal, con luz proveniente del lado superior izquierdo:



Especial interés tiene la sección de los dobleces, porque es en realidad la que nos va a generar la percepción de papel plegado que tenemos interiorizada:



Con una función que genere una curva similar podemos construir un "mapa de elevación" sintético, derivando de él un hillshade que aplicado como máscara de luminosidad a cualquier imagen o mapa nos dará ese look 3D que tiene el papel plegado.

Tomando el primer cuarto de ciclo de la función coseno, invirtiéndola y replicándola en espejo se tiene una curva que exagerada con un exponente de 4 nos proporciona un perfil muy similar al del papel doblado:


~~~

Aplicamos esta función sobre una matriz del mismo tamaño que el mapa a plegar, alternando valores positivos y negativos de "elevación" a ambos lados del plegado central como ocurre en una situación real. Se construyen individualmente los mapas de elevación de los pliegues horizontales y verticales:



El motivo de hacerlo por separado es porque se hace complicado evitar artefactos en las zonas de cruce. Aún así hemos tenido que suavizar los valores de elevación de los pliegues horizontales al acercarnos al pliegue vertical, ya que discontinuidades en la elevación generan saltos en el hillshade.

La combinación anterior por multiplicacion solo se muestra a efectos ilustrativos, en realidad no se usa en el código sino que sobre cada mapa de elevación individual calculamos el respectivo hillshade:




Ambos hillshade sí se combinan (promediándolos) sin que aparezca ningún artefacto ya que no los tenían en origen. La textura pseudo 3D obtenida solo tiene que multiplicarse por la imagen que se nos antoje para simular su doblado en papel.

Aplicando el proceso al mapa terminado que obtuvimos en 'Los horizontes del lago Michigan con R' (hacer clic para mayor resolución):



El resultado es muy bueno, pero como queda excesivamente sintético añado una versión creativa encajándolo con Photoshop en la foto del folio real con que empezaba el artículo, aunque los pliegues son los calculados en R (hacer clic para mayor resolución):


~~~

Repositorio con el código R: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.