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:
- Boucle à travers des angles de 0 à 45.
- Pour l'angle actuel, pour chaque point de la figure, calculer un nouvel emplacement pivoté
- 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
- 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?
la source
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.
la source