Algo pour intersection de figures - Algo - Programmation
Marsh Posté le 22-06-2007 à 19:43:42
Le plus rapide possible = bounding box
=> Tu vas donc inclure chacune de tes formes dans un rectangle "droit" (c'est à dire dont les arrêtes sont parralèles aux axes).
- Pour le cercle, c'est x1,y1 = centre.x - rayon, centre.y - rayon / x2,y2 = centre.x + rayon, centre.y + rayon
- Pour les quadrilatères, c'est x1,y1 = min(x1, x2, x3, x4), min(y1, y2, y3, y4) / x2,y2 = max(x1, x2, x3, x4), max(y1, y2, y3, y4)
Ensuite, tu fais les calculs simples sur les bounding box : tu peux t'en tirer donc simplement en faisant des comparaisons < > sur les points 1 et 2 de chaque forme
Quand tu détectes une intersection de bounding box, tu fais alors le calcul de l'intersection "classique" de formes comme tu as appris au lycée. (le truc chiant étant de trouver les intersections entre l'arrête d'un quadrilatère et un cercle) => tu peux dégrossir avant en recherchant la présence d'un sommet des quadrilatères dans le cercle.
PS : Pour voir si deux cercles se chevauchent, pas la peine de te lancer dans des calculs savants : (x1-x2)² + (y1-y2)² < (r1 + r2)² est suffisant.
PS2 : Pour voir si un sommet d'un quadrilatère est présent dans un cercle, même formule ou presque : (x1-x2)² + (y1-y2)² < (r1)²
PS3 : Tu parles d'intersections. Mais dois-tu aussi détecter les inclusions ?
Marsh Posté le 22-06-2007 à 21:15:03
Genre, une piste, ici en C#
Code :
|
Marsh Posté le 22-06-2007 à 21:19:56
Extrait des résultats :
|
Comme tu peux le voir :
1/ Tous les tests dont aucun résultat n'est affiché on été giclés dès les deux premières optimisations, donc des calculs très simples et rapides à faire
2/ Les deux secondes optimisations permettent de résoudre la moitié des cas, avec des calculs très simples
En résumé, ça vaut carrément le coup d'utiliser au moins ces optimisations, puisqu'elles évident un nombre incalculable de calculs complxes inutiles.
PS : Et si t'es pas convaincu par mes optimizations de la mort qui tue, voici ce que donne le script lancé deux fois dans la foulée (même jeu de formes) pour 100 formes. Et je rappelle que moi, je ne fais pas les calculs complexes, chercher si des demi-plans se chevauchent (chais pu comment faire, et j'ai pas envie de m'y remettre ) donc j'imagine effectivement à quel point ça peut être lent chez toi
|
A noter qu'enfin, une dernière optimisation peut consister à regrouper tes objets par "zone" en amont, histoire de ne même pas avoir à faire le test de la bounding box lorsqu'on sait à l'avance que les deux formes sont très éloingnées. Ceci doit par contre être fait vraiment en amont, c'est à dire avant que ton programme ne tourne : au lieu de check 10000 formes par exemple, tu check 100 fois 100 formes, en supposant que tu les a regroupées en 100 zones.
Marsh Posté le 22-06-2007 à 23:18:43
c'est bon ca !
Tu aurais des pistes dans le meme delire pour la detection de contour ?
Marsh Posté le 23-06-2007 à 11:53:22
oui je dois détecter les inclusions aussi. Pour info je bosse avec la bibrairie OpenCV si certain d'entre vous connaissent. J'essayerai vos solutions lundi et je vous tiens au courrant. Merci pour toutes ces pistes.
Pour deadalnix, avec cette lib la détection de contour peut se faire très simplement en quelques lignes si ca t'intéresse je te dirais comment faire.
Marsh Posté le 23-06-2007 à 17:19:55
Tiens au fait, je suis en train de remarquer que les tests sur les bounding sont largement insuffisants Je te laisse faire un dessin pour voir les (nombreux) cas qui ne sont pas pris en compte
Marsh Posté le 23-06-2007 à 20:28:18
ah ouais ca marche pas finalement cette méthode ? faut faire quoi alors ?
Marsh Posté le 24-06-2007 à 13:57:20
Si l'idee de la metgode est bonne mais il manque quelq cas partivuliers dans l'implementation.
Pour la detection de contour, ca consiste a creer un polygone (on va negliger le cas des cercles sinon ca en finit jamais) qui represente le contour d'un ensemble de polygone.
Imagine un emsemble de formes, et colories les toutes de la meme couleur, disons bleu, tu va obtenir une forme bleue. Quel est le polygone qui en est le contour ?
Marsh Posté le 25-06-2007 à 00:27:34
C'est le cas "optim1" qui est foireux dans mon implémentation.
A priori, cette correction couvre tous les cas :
Code :
|
Marsh Posté le 22-06-2007 à 17:26:00
Salut,
J'ai des données décrivant plusieurs figures dans un plan. Ces figures peuvent etre de 2 types: quadrilatères (forme fermée quelconque avec 4 cotés) et cercles. Pour les quadrilatères j'ai 4 couples de coordonnées correspondant aux 4 sommets du quadrilatère; et pour les cercles j'ai un couple correspondant au centre et un entier correspondant à son rayon. Je cherche un algo le plus efficace possible en terme de temps de calcul qui me dise quelles sont les figures qui ont une intersection non vide avec une autre.
Message édité par cimourdain le 22-06-2007 à 17:26:51