|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Une implémentation Java de l'algorithme de Triangulation de Delaunay incrémentale inventé par Leonidas Guibas et Jorge Stolfi.
![]() La classe QuadEdge qui décrit la structure de données duale (face/segment): Code java :
La classe Delaunay qui effectue la triangulation: Code java :
et enfin un exemple d'utilisation: Code java :
Edit : Modif de la méthode QuadEdge.IsOnLine(), cf. post #38 de Commander Keen.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||||
|
00
|
|
|
#2 | ||||
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Hello, merci tout d'abord pour l'implémentation :
Code :
Code :
|
||||
|
|
00
|
|
|
#3 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Oui, merci dans le même genre d'idée en C++
J'ai renommé les objets QuadEdge par des QuadEdge* la liste quadEdge par listQuadEdge et l'appel à la classe QuadEdge. par QuadEge:: Sinon je ne m'en sortais pas. Bon encore une centaine d'erreurs à trouver mon Delaunay ne marche pas encore.... Sinon personne ne sait comment on fait des Getter avec un attribut pointeur et des const ? |
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
j'ai une version C, si ça intéresse quelqu'un... (uniquement de la triangulation). Mais j'ai plusieurs sources free de l'ensemble...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#6 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
Dans l'implémentation Java que j'ai postée, cette partie là est une création originale. Je me suis assez cassé la tête dessus pour avoir quelque chose d'efficace, mais je n'ai jamais démontré rigoureusement son exactitude. J'ai juste lancé plusieurs milliers de triangulations et comparé les résultats avec d'autre implémentations.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Hello,
En tous cas merci beaucoup à PseudoCode pour son implémentation qui est à la fois simple (relativement à la complexité du problème) et élégante J'ai bien aimé la séparation entre ce qui est topologie et géométrie. En ce qui concerne Splice, je n'ai pas tout bien compris ce que ça faisait, même après avoir vu les explications de l'article qui sont bien théoriques ![]() Ensuite : Code :
(Bon mon compilateur semble l'accepter...) Ca c'est pas super heureux, je vais transformer les coordonnées des points pour avoir des flottants, selon l'échelle utilisée ensuite, ça peut causer des problèmes... Je pense définir une constante epsilon et la mettre bien en vue au début... Code :
int x_min = (int)((minx-centerx-1)*10+centerx); Bon, après la fin je n'ai pas encore trop vu, ma traduction semble ne pas trop marcher... Bon je vais voir. Oui, sinon d'autres implémentations pourraient m'être utiles. Je vais rester pas de temps sur le problème. (Delaunay contraint, peut être tenter des modifications dynamiques, des optimisations avec les Edge orientées (SymEdge)... des recherches de chemins à travers la triangulation - application aux jeux 3D... si tout marche Delaunay en 3D...) Envoyez moi un MP si vous voulez mes coordonnées. Souviron34, je t'envoie un MP, merci |
||
|
|
00
|
|
|
#8 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
Citation:
Citation:
. D'un autre coté je n'utilise que des coordonnées entières pour les points, donc ca passe.Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
[je poste ça cette après-midi]
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#10 | ||
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Ok, merci PseudoCode pour tes retours
J'ai encore juste un souci. Alors j'insère un point, => création de 4 arêtes vers la BoundingBox : OK Insertion d'un nouveau point => création de 3 nouvelles arêtes : OK Mais au 3è point, il semble ne pas me localiser convenablement le point Alors coordonnées des points : (56,0) (81,19) (48,59) Pour locate (de ce dernier point), il me renvoie au point (56,0) et ensuite il me sélectionne les 3 points (56,0) (81,19) et le point haut gauche de la BoundingBox Alors que le point (48,59) est dans le triangle (81,19) et les 2 points hauts de la BoundingBox... Je sais pas, j'ai pourtant mot à mot le même algo que Guibas et Stolfi... (calqué sur le tien aussi) *------------------------------------------------------------- Bon alors à la recherche de mon erreur Code :
Je pensais au début qu'ils étaient là pour coder de façon redondante a,b,c et d... Mais si on regarde setBoundingBox, on voit qu'ils sont updatés avant le calcul des nouveaux x_min, x_max ... et pas après... |
||
|
|
00
|
|
|
#11 | |||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
![]() (minx, miny, maxx, maxy) sont les "vraies" coordonnées de la bounding-box. C'est à dire les coordonnées X/Y minimum et maximum des points qui ont été insérés jusqu'à présent. (a,b,c,d) sont les coordonnées d' une surounding-box. C'est à dire un rectangle qui englobe la bounding-box. Les 4 points a,b,c,d sont considérés commes des points "a l'infini" par rapport aux points qui ont été insérés jusqu'à présent. D'ou la formule: a == (minx-centerx-1)*10+centerx; qui envoie le point "a" dix fois plus loin, à gauche, que "minx" par rapport au centre de la bounding box. Code :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|||
|
00
|
|
|
#12 | ||
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
J'ai changé par ça, ça marche bien mieux maintenant
Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
... En théorie ca devrait marcher moins bien. Les 4 points a,b,c,d sont censés être à l'infini pour que la triangulation respecte le critère de Delaunay.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
C'est ce que je fais, pour moi la petite boite à la même taille que la grande, donc elle se rapproche de l'infini...
|
|
|
00
|
|
|
#15 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Salut pseudoCode,
Bon je repasse sur le Forum parce que c'est plus pratique. Sinon mon système avec Id fonctionne. (Le problème était que pour marquer une arête il faut déjà la retrouver dans le graphe... avec la structure des quadEdge c'est pas évident, surtout si tu dois faire ça avec toutes les arêtes, de plus il faut pouvoir marquer des arêtes qui n'existent pas encore, donc les créer avant, pas pratique...) Mais maintenant j'ai un bug un peu bizarre et qui se retrouve assez peu souvent. En fait l'algo d'insertion à un moment tu "flip" (ou "swap") les arêtes. Quand ton polygone formé de 4 points est convexe (+ de 99% des cas), tout va pour le mieux dans le meilleur des mondes (cf p. 119). Mais quand il est pas convexe, il se produit une grosse catastrophe ![]() Et ça l'article de Guibas et Stolfi n'en parle pas... EDIT : Le polygone MNLX |
|
|
00
|
|
|
#17 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
Voila une figure, il faut swapper l'arête rouge au milieu de la zone jaune
|
|
|
00
|
|
|
#18 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Je ne vois pas trop dans quel cas (avec l'algo incrémental) on peut se retrouver dans un cas pareil.
Tu as un exemple ?Oups. Pas vu que tu as posté un image pendant ce temps là. Je regarde ca. Remarque: les 4 points extrêmes dans le dessin, ce ne seraient pas ceux de la bounding-box ? EDIT: J'ai testé la triangulation avec des points dans la même configuration que toi Code :
). Je me demande s'il faut vraiment swaper ce edge ? La triangulation est incorrecte ?
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#19 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2008 Messages : 47 ![]() |
En fait j'ai identifié l'erreur.
J'ai les points (dans l'ordre) (90, 35) (166, -326) (166, 384) (51, 71) Et le test incircle me renvoit que le point (51 71) est à l'intérieur du cercle formé par les 3 autres... Ce qui est à vu de nez est manifestement faux... |
|
|
00
|
|
|
#20 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 818 ![]() |
Citation:
Si je fais: Code java :
j'obtiens le résultat: Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
Copyright © 2000-2013 - www.developpez.com