Comment calculer efficacement la rotation des figures?

13

Image 1 Image 2

J'ai une figure représentée par une matrice d'octets (matrice de type bitmap). La figure d' exemple est montrée sur le Picture 1.

Le but est de trouver le meilleur angle de rotation d'une figure donnée . Lorsque la figure pivote selon le meilleur angle, le rectangle qui est parallèle aux axes X et Y et inscrit la figure a la plus petite surface.

Les rectangles qui inscrivent la figure sont gris clair sur les images. Dans le Picture 2, vous pouvez voir que la rotation idéale de la figure est d'environ 30 degrés dans le sens des aiguilles d'une montre.

Maintenant, je sais par algorithme comment trouver cet angle, mais il me semble que c'est très inefficace. Ça va comme ça:

  1. Boucle à travers des angles de 0 à 45.
  2. Pour l'angle actuel, pour chaque point de la figure, calculer un nouvel emplacement pivoté
  3. Trouver les limites du rectangle contenant le chiffre (minimum et maximum x, y) et l'enregistrer si c'est la meilleure correspondance jusqu'à présent
  4. Angle suivant

C'est une sorte de méthode de force brute qui fonctionne bien et assez rapidement pour les petites figures. Cependant, je dois travailler avec des chiffres qui contiennent jusqu'à 10 millions de points, et mon algorithme devient lent.

Quel serait un bon algorithme pour ce problème?

Dusan
la source

Réponses:

20

Il semble que vous puissiez trouver la zone de délimitation minimale alignée arbitrairement en utilisant l' algorithme des étriers rotatifs à temps linéaire .

Une fois que vous avez le cadre de délimitation, il vous suffit de déterminer l'angle de rotation en calculant la pente de l'un des côtés.

Dan Pichelman
la source
C'est une excellente solution, très bonne.
Informé
Génial, puisque j'ai déjà trié les points par x et y, je peux trouver une coque convexe avec ce en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… et utiliser l'algorithme existant avec des points de coque.
Dusan
12

La première étape de votre approche est imparfaite - il existe un nombre infini de valeurs réelles entre 0 et 45, donc cela n'a aucun sens de les "parcourir". Cependant, votre algorithme peut être réparé:

  • trouver la coque convexe du polygone

  • boucle à travers le nombre fini (!) d'angles donné par les bords extérieurs de la coque convexe

  • appliquez maintenant les étapes 2 à 4 en utilisant ces angles.

Cela fonctionne car il peut être démontré que le rectangle de fermeture minimum doit toucher l'un des bords extérieurs de la coque convexe.

Doc Brown
la source
Oui, c'est exactement ce que je vais faire, déjà trouvé avec l'aide de la réponse de Dan. Je vous remercie.
Dusan
@Dusan: Je ne suis pas sûr que l'autre réponse décrive la même approche, j'ai donc essayé de décrire la solution de manière plus simple, j'espère un peu plus claire. Trouvé une description ici: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown
Oui, vous avez raison, votre approche est beaucoup plus concrète et plus simple et plus claire, mais j'ai moi-même conclu la même approche par les indices donnés dans la réponse de Dan, alors je lui ai donné une acceptation. J'espère que votre réponse gagnera beaucoup plus de votes positifs. Pas d'émotions fortes. À votre santé!
Dusan