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

Calcul scientifique Python Discussion :

Courbes de beziers


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Courbes de beziers
    Bonjour à tous,

    Je suis sur un petit projet assez complexe par rapport à mes maigres connaissances en géométrie. Je dessine une Map interactive (PyGTK) d'un réseau informatique WAN+LAN.
    Pour faire ceci, j'utilise le format xdot (graphviz).
    Je dessine donc des "Node" pour représenter les différents réseaux et routeurs, liés les uns aux autres par des "Edge", lien LAN et WAN.
    J'ai ajouté le fait de pouvoir faire du Drag'n'Drop sur mes objets graphiques afin de pouvoir modifier la disposition puis de l'enregistrer. Tout ceci fonctionne correctement.
    Les liens entre les "Node" sont retracés. Ces liens sont des courbes de beziers.

    Mon problème est qu'au bout d'un moment, ma formule de recalcule des coordonnées pour chaque points des courbes devient plutôt problématique. Pour faire simple, au début j'ai des jolies courbes, ensuite en déplacant plusieurs fois, je finis par avoir des "bosses" dans mes courbes (pas cool ca !).

    Je me demande du coup si je recalcule correctement les coordonnées. Pourriez vous me dire ce que vous pensez de ma façon de faire ? Où puis-je l'améliorer afin de retracer mes points de façon intelligente, et comment calculer le nombre de points nécessaires ?

    Voici mon code sur cette fonction :

    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
     
    # dx => décalage de la tête de mon lien en X
    # dy => décalage de la tête de mon lien en Y
    # xs, ys => x, y du premier point (celui qui ne bougera pas)
    # xe, ye => x, y du dernier point (celui qui est décalé de dx et dy)
     
        def move_head(self, dx, dy):
            newPoints = []
            xs, ys = self.points[0]
            xe, ye = self.points[-1]
            if xe == xs:
                px = xs + dx
            else:
                px = xe -xs
            kx = float(dx) / px
            if ye == ys:
                py = ys + dy
            else:
                py = ye - ys
            ky = float(dy) / py
            for i in range(len(self.points)):
                x = self.points[i][0]
                y = self.points[i][1]
                if x == xs:
                    decx = (x + dx) * ((((i+1)*100)/len(self.points))/100)
                else:
                    decx = x - xs
                if y == ys:
                    decy = (y + dy) * ((((i+1)*100)/len(self.points))/100)
                else:
                    decy = y - ys
                nx = int(kx * decx) + x
                ny = int(ky * decy) + y
                newPoints.append((nx, ny))
            self.points = newPoints

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,
    lorsque l'on souhaite tracer une Bézier, on utilise d'algorithme de De Casteljau et non pas les polynômes de Bézier car on ne peut calculer au dela de 35 le triangle de Pascal.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Entre autre je dirais aussi qu'une bézier sera de toute manière totalement affectée par le mouvement d'un seul des points. Si tu veux un truc plus stable essaye d'utiliser des Bsplines, les modifs deviendront alors locales aux points

Discussions similaires

  1. Recuperer coordonnees courbe de Bezier
    Par kitsune dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/10/2007, 07h11
  2. Fermer une courbe de Bezier
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 15/05/2007, 12h21
  3. courbe de bezier
    Par widi70 dans le forum C++
    Réponses: 12
    Dernier message: 17/03/2007, 12h52
  4. [vecteurs] dessiner les courbes de Bezier
    Par luta dans le forum Flash
    Réponses: 4
    Dernier message: 03/07/2006, 09h58
  5. Courbes de Beziers
    Par venomelektro dans le forum OpenGL
    Réponses: 10
    Dernier message: 23/12/2004, 00h29

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