IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Utilisation Poly2Tri en VB.NET


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut Utilisation Poly2Tri en VB.NET
    Bonjour,

    j'ai besoin de triangulariser des formes géométriques 2D définies par des polygones

    J'ai déjà mes formes 2D organisés "proprement" sous forme de forêts de polygones ; autrement dit :
    - ma forêt est une liste de polygones de type "extérieurs"
    - chaque polygone "extérieur" contient une liste de polygones inclus qui sont tous de type "intérieurs" (des trous)
    - chaque polygone "intérieur" contient une liste de polygones inclus qui sont tous de type "extérieur" (autrement dit, il peut y avoir des îles dans les trous)
    - ... chaque île peut avoir des trous qui ont eux-même des îles, ect...

    N'importe quel dessin 2D en noir et blanc (pas en niveaux de gris, en noir et blanc) peut être entièrement décrit par ma structure "forêt de polygones"

    Ma structure de données est propre, c'est à dire :
    - elle est correcte, pas de chevauchement ou d'erreurs, pas de polygones repliés sur eux même (genre en "8"), pas de polygones nuls ou tout plats
    - tous les points des polygones sont dans le bon ordre
    - aucun point n'est confondu avec un autre (pas de points en double ou en triple)
    - l'ordre des points des polygones extérieurs tourne dans le sens horaire, ceux des polygones intérieur dans le sens anti-horaire, de sorte que lorsque l'on parcours un polygone la matière est toujours "à droite"

    Après quelques recherches, le code de Poly2Tri est exactement ce qu'il me faut http://sites-final.uclouvain.be/mema/Poly2Tri/

    Problème : pas de DLL, que du code C++

    Mon appli où je souhaite utiliser ce code est en Visual Basic Express 2010 et elle est relativement grosse (plus de 40.000 lignes de code, une vingtaine de fenêtres)

    Il y a plusieurs solutions à priori :

    - traduire le code de Poly2Tri en VB.NET : difficile, d'autant que ce genre d'algorithme est sensible à l'instabilité numérique et que le code est optimisé pour la vitesse ; je risque d'avoir pas mal d'instruction "purement c++" non traduisibles directement en VB.NET, et dans le code pour éviter l'instabilité numérique il y a des astuces qui exploitent certainement la façon dont le C++ réalise les opérations mathématiques sur les flottants

    - développer moi-même le code : c'est idiot, je vais réinventer la roue, et surtout je vais certainement me planter avec les subtilités liées à l'instabilité numérique

    - utiliser Visual C++ Express (ou C#) pour adapter Poly2Tri en un code utilisable par VB.NET ; dans mon projet VB.NET j'utilise déjà une DLL qui a été écrite en C++

    - trouver un autre code de triangularisation en VB.NET, aussi bon que Poly2Tri ; comme ma structure de données étant propre, elle n'occasionne pas de "stress" particulier pour l'algorithme de triangularisation; mais certains polygones peuvent êtres très fins, certains points très éloignés les uns des autres (lignes droites) ou au contraire assez rapprochés (polygone approximant une forme courbe)

    Malgré pas mal de recherches sur le net je suis surpris de n'avoir trouvé aucun exemple d'utilisation de Poly2Tri en VB.NET car Poly2Tri est populaire, VB.NET également

    Merci

    A bientôt

  2. #2
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Solution :

    1. Téléchargez ce code : http://github.com/MaulingMonkey/poly2tri-cs

    2. Récupérez un des fichiers Poly2Tri.dll

    3. Ajoutez la DLL dans les références de votre projet

    4. L'utilisation est assez triviale - exemple (code a adapter selon vos besoins):

    Dans l'exemple, contour est un polygone "a vous" qui contient une liste de point (ListePoints) et une liste des trous (ListeContoursInclus)

    Les trous sont des polygones, qui eux même ont une ListePoints, et une ListeContoursInclus qui sont des îles.

    Les îles sont des polygones, qui eux même ont une ListePoints, et une ListeContoursInclus qui sont des trous.

    ... (c'est récursif)

    L'exemple ne peut pas être exécuté (il faudrait que je mette des milliers de lignes !) mais il est assez parlant pour montrer comment utiliser Poly2Tri en VB.NET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    '...
    Dim poly As Poly2Tri.Polygon
    Dim trou As Poly2Tri.Polygon
    Dim tri As Poly2Tri.DelaunayTriangle
    Dim points As List(Of Poly2Tri.PolygonPoint)
     
    'Créer le polygone :
    points = New List(Of Poly2Tri.PolygonPoint)
    For i = 0 To contour.ListePoints.Count - 1
    	p = contour.ListePoints.Item(i)
    	points.Add(New Poly2Tri.PolygonPoint(p.X, p.Y))
    Next i
    poly = New Poly2Tri.Polygon(points)
     
    'On ajoute les trous :
    For Each contour2 In contour.ListeContoursInclus
    	points = New List(Of Poly2Tri.PolygonPoint)
    	For i = 0 To contour2.ListePoints.Count - 1
    		p = contour2.ListePoints.Item(i)
    		points.Add(New Poly2Tri.PolygonPoint(p.X, p.Y))
    	Next i
    	trou = New Poly2Tri.Polygon(points)
    	poly.AddHole(trou)
    Next
     
    'TRIANGULATION
    Poly2Tri.P2T.Triangulate(poly)
     
    'ICI ON RECUPERE LES TRIANGLES
    For Each tri In poly.Triangles
    	'tri.Points(0).Xf
    	'tri.Points(0).Yf
    	'tri.Points(1).Xf
    	'tri.Points(1).Yf
    	'tri.Points(2).Xf
    	'tri.Points(2).Yf 
    Next
     
    'On traite les îles :
    For Each contour2 In contour.ListeContoursInclus
    	For Each contour3 In contour2.ListeContoursInclus
    		'RECURSIVITE : ON FAIT LE MEME TRAITEMENT QUE POUR contour
    	Next
    Next
    '...

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Tu peux voir ca en .Net ce Triangle.Net sur CodePlex:
    https://www.google.fr/url?sa=t&rct=j...32479545,d.bGs

    bon code...

  4. #4
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour

    Tu peux voir ca en .Net ce Triangle.Net sur CodePlex:
    https://www.google.fr/url?sa=t&rct=j...32479545,d.bGs

    bon code...
    J'avais entendu parler de Triangle, mais Poly2Tri est plus performant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [.NET 2.0] Erreur lors de l'utilisation d'une application .NET
    Par Jérôme Lambert dans le forum Framework .NET
    Réponses: 6
    Dernier message: 21/11/2006, 15h45
  2. Utiliser IFilter en VB.Net
    Par fabrisss dans le forum Windows Forms
    Réponses: 1
    Dernier message: 31/07/2006, 09h05
  3. Réponses: 1
    Dernier message: 18/07/2006, 16h44
  4. [JNI] utiliser du code DOT NET via JNI, possible ?
    Par Elbarto dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/06/2006, 17h41
  5. utilisation des delegate [VB.net]
    Par grand_prophete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/04/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo