2009-05-20 7 views
7

J'ai besoin de déterminer le rectangle de délimitation d'un polygone à un angle arbitraire. Cette image illustre ce que je dois faire:Calcul du rectangle de délimitation à un angle d'un polygone

alt text http://kevlar.net/RotatedBoundingRectangle.png

Le rectangle rose est ce que je dois déterminer à différents angles pour les polygones simples 2d.

Toutes les solutions sont très appréciées!

Edit:

Merci pour les réponses, je l'ai eu de travail une fois que je suis les points centraux correct. Vous êtes géniaux les gars!

+0

Par "différents angles" voulez-vous dire que le rectangle de délimitation doit être à un certain angle, ou que la forme à l'intérieur doit être à un certain angle? – Welbog

+0

Vous devrez corriger certains angles ici, sinon il y a plusieurs solutions. – Glenn

+0

L'angle du rectangle englobant est ce qui varie. J'ai pensé à faire tourner le polygone dans le sens inverse, puis à ajuster un rectangle autour de celui-ci et à faire pivoter les points du rectangle, mais je pense que je me trompe en identifiant correctement les points centraux. – kevin42

Répondre

7

Pour obtenir un cadre de délimitation avec un certain angle, faites pivoter le polygone dans le sens contraire. Ensuite, vous pouvez utiliser les coordonnées min/max x/y pour obtenir une boîte englobante simple et la faire pivoter selon l'angle pour obtenir votre résultat final. De votre commentaire, il semble que vous ayez des problèmes pour obtenir le point central du polygone. Le centre d'un polygone doit être la moyenne des sommes de coordonnées de chaque point. Donc, pour les points P1, ..., PN, calculer:

xsum = p1.x + ... + pn.x; 
ysum = p1.y + ... + pn.y; 
xcenter = xsum/n; 
ycenter = ysum/n; 

Pour que cela soit complète, j'ajoute aussi quelques formules pour la rotation en cause. Pour faire pivoter un point (x, y) autour d'un point central (cx, cy), procédez comme suit:

// Translate center to (0,0) 
xt = x - cx; 
yt = y - cy; 
// Rotate by angle alpha (make sure to convert alpha to radians if needed) 
xr = xt * cos(alpha) - yt * sin(alpha); 
yr = xt * sin(alpha) + yt * cos(alpha); 
// Translate back to (cx, cy) 
result.x = xr + cx; 
result.y = yr + cx; 
+0

Battez-moi au calcul du point central. +1 pour avoir la bonne réponse – Welbog

+0

Pour cet algorithme, est-ce que le point sur lequel vous pivotez est important? – Emmett

+0

Non, ce n'est pas grave si vous voulez juste connaître la taille de la boîte englobante, mais cela aidera avec le placement de la boîte englobante autour du polygone. – schnaader

2

J'interprétation votre question signifie « Pour un polygone 2D donné, comment calculez-vous la la position d'un rectangle de délimitation pour lequel l'angle d'orientation est prédéterminé? " Et je le ferais en tournant le polygone contre l'angle d'orientation, puis utiliser une simple recherche de ses points maximum et minimum dans les deux directions cardinales en utilisant n'importe quel algorithme de recherche est approprié pour la structure les points du polygone sont stocké. (En termes simples, vous devez trouver les valeurs X les plus élevées et les plus basses, et les valeurs Y les plus élevées et les plus basses.)

Ensuite, les minima et les maxima définissent votre rectangle.

Vous pouvez faire la même chose sans faire d'abord pivoter le polygone, mais votre recherche de points minimum et maximum doit être plus sophistiquée.

+0

Ceci est correct. La boîte englobante ne doit pas être calculée pour le polygone avec une rotation de 0, puis la rotation de la limite. Cela pourrait donner une bbox trop grande. Je suppose AABB (axe aligné). – ralphtheninja

3

Pour obtenir le plus petit rectangle, vous devez obtenir le bon angle. Cela peut s'accomplir par un algorithme utilisé dans la détection de collision: les boîtes de délimitation orientées. Les étapes de base:

Obtenir tous les sommets cordinates
Construire une matrice de covariance
Trouver les valeurs propres
projet tous les sommets dans l'espace
Trouver des valeurs propres max et min dans chaque espace de valeurs propres.

Pour plus d'informations que google OBB « Détection de colision »

Ps: Si vous projetez seulement tous les sommets et de trouver un maximum et minimum que vous faites AABB (axe boîte englobante aligné). C'est plus facile et nécessite moins d'effort de calcul, mais ne garantit pas la boîte minimale.

1

Pour obtenir un rectangle avec une zone minimale entourant un polygone, vous pouvez utiliser l'algorithme a rotating calipers. L'idée clé est que (contrairement à votre exemple d'image, donc je suppose que vous n'avez pas réellement besoin d'une zone minimale?), Un tel rectangle minimal est colinéaire avec au moins un bord de (la coque convexe) du polygone .

Questions connexes