lunes, 19 de agosto de 2024

Modelo geométrico de piedra de playa con R

Cuando voy a una playa de piedras me gusta fijarme en la forma ovalada que adquieren las piedras, labradas por las olas a lo largo de miles o millones de años. Vamos a programar una rutina que, a partir del contorno de una piedra de este tipo, la modele en base a 4 elipses. De cada una de ellas se utiliza 1/4 de la forma garantizando la continuidad de las derivadas, y por tanto la suavidad del contorno modelado, en los cuatro puntos de unión.




Partimos de las fotografías de dos piedras de la preciosa Playa de las Negras (Almería), que deben el color oscuro a su origen volcánico (por si alguien se ofende, cuando recojo piedras de una playa las devuelvo en mi siguiente visita):



Sobre el contorno de cada piedra ejecutamos el siguiente algoritmo:

  • Encontrar el diámetro máximo trazable entre dos puntos del borde, que denominamos AB.
  • Buscamos los puntos C y D de la periferia a cada lado de este diámetro cuya recta tangente resulte paralela al diámetro AB.
  • Obtenidos los cuatro puntos A, B, C y D trazamos las 4 porciones de 1/4 de elipse cada una, correspondientes a los tramos AC, CB, BD y DA.

Hacer clic sobre el resultado para verlo a mayor resolución:


~~~

De los pasos realizados quizá merezca la pena detallar la forma de calcular los puntos de tangencia C y D. Almacenamos en una matriz de 2 columnas las coordenadas de todos los puntos que constituyen el contorno de la piedra, ordenándolos por su proximidad de forma que píxeles vecinos en el borde de la piedra aparezcan en filas contiguas de dicha matriz.

Para estimar el ángulo de la recta tangente al contorno en un punto determinado promediamos los ángulos de las rectas que, pasando por dicho punto, también pasan por sendos puntos situados a la misma distancia (en filas de la matriz) por detrás (Pre) y por delante (Pos) del punto considerado:


El píxel cuya tangente estimada tenga un ángulo más próximo al del diámetro AB (que es conocido), será considerado el punto de tangencia que definirá la unión entre elipses.

A continuación puede verse este cálculo para toda la periferia de cada piedra, dividido en dos cálculos por piedra correspondientes a las dos tangentes a ambos lados de su diámetro principal. Las líneas discontínuas señalan la pendiente exacta del diámetro AB así como el píxel cuya tangente estimada (gráfica negra) más se le aproxima:


~~~

Para tratar de cuantificar la calidad de cada modelo ideamos una métrica consistente en la media geométrica de dos valores:

  • A: % de superficie del modelo contenido en la superficie de piedra real
  • B: % de superficie de la piedra real contenido en la superficie del modelo

Esta métrica valdrá 1 si y solo si el ajuste fuera perfecto y será menor de 1 en otro caso, penalizando fuertemente gracias a la media geométrica que cualquiera de los dos ratios A o B sea bajo. Como se intuía a simple vista observando los descuadres, la segunda piedra colabora bastante más que la primera en dejarse modelar por 4 elipses:


Por la forma cerrada en que obtiene la geometría, el método admite una única solución a la que llega de manera inmediata. Pero precisamente por eso tiene el hándicap de que si el contorno a modelar correspondiera exactamente a 4 cuartos de elipse con derivadas continuas, lo habitual será no obtener el ajuste del 100%, algo que me incomoda bastante.

Como ejecuta muy rápido quizá me anime a hacerlo iterativo y que busque alrededor de ese diámetro máximo el modelo de piedra con menor error de ajuste.

~~~

Si crees que es muy friki pensar en estas cosas te diré que no estoy solo: ya desde Aristóteles hasta nuestros días (ver 'OnTheOvalShapesOfBeachStones.pdf'), somos unos cuantos los que admiramos las piedras de playa.

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.