¿Cómo calcular la rotación de figuras de manera eficiente?

13

Foto 1 Imagen 2

Tengo una figura representada a través de una matriz de bytes (matriz similar a un mapa de bits). La figura de ejemplo se muestra en el Picture 1.

El objetivo es encontrar el mejor ángulo de rotación de alguna figura dada . Cuando la Figura se gira con el mejor ángulo, el rectángulo que es paralelo a los ejes X e Y e inscribe que la Figura tiene el área más pequeña.

Los rectángulos que inscriben la figura se muestran como gris claro en las imágenes. En el Picture 2, puede ver que la rotación ideal de la Figura es de aproximadamente 30 grados en el sentido de las agujas del reloj.

Ahora, conozco el algoritmo de cómo encontrar este ángulo, pero me parece que es muy ineficiente. Dice así:

  1. Recorre los ángulos de 0 a 45.
  2. Para el ángulo actual, para cada punto de la figura, calcule la ubicación nueva, girada
  3. Encuentre los límites del rectángulo que contiene la figura (mínimo y máximo x, y) y regístrelo si es la mejor coincidencia hasta ahora
  4. Ángulo siguiente

Este es un tipo de método de fuerza bruta y funciona bien y razonablemente rápido para las figuras pequeñas. Sin embargo, necesito trabajar con cifras que contengan hasta 10 millones de puntos, y mi algoritmo se vuelve lento.

¿Cuál sería un buen algoritmo para este problema?

Dusan
fuente

Respuestas:

20

Parece que puede encontrar el cuadro delimitador mínimo alineado arbitrariamente utilizando el algoritmo de pinzas giratorias de tiempo lineal .

Una vez que tenga el cuadro delimitador, solo necesita determinar el ángulo de rotación calculando la pendiente de uno de los lados.

Dan Pichelman
fuente
Esta es una gran solución, muy buena.
InformadoA
Genial, dado que ya he ordenado puntos por x e y, puedo encontrar el casco convexo con este en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/... y usar el algoritmo existente con puntos de casco.
Dusan
12

El primer paso de su enfoque es defectuoso: hay un número infinito de valores reales entre 0 y 45, por lo que no tiene sentido "recorrerlos". Sin embargo, su algoritmo puede repararse:

  • encontrar el casco convexo del polígono

  • recorre el número finito (!) de ángulos dados por los bordes exteriores del casco convexo

  • ahora aplique los pasos 2 a 4 usando estos ángulos.

Esto funciona porque se puede demostrar que el rectángulo mínimo envolvente debe tocar uno de los bordes exteriores del casco convexo.

Doc Brown
fuente
Sí, eso es exactamente lo que voy a hacer, ya encontré ayuda con la respuesta de Dan. Gracias.
Dusan
@Dusan: No estoy seguro de que la otra respuesta describa el mismo enfoque, por lo que traté de describir la solución de una manera más simple, con suerte un poco más clara. Encontré una descripción aquí: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown
Sí, tiene razón, su enfoque es mucho más concreto, más simple y más claro, pero yo mismo he concluido el mismo enfoque por las pistas dadas en la respuesta de Dan, así que le di una aceptación. Espero que su respuesta obtenga muchos más votos positivos. Sin resentimientos. ¡Salud!
Dusan