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

Python Discussion :

Repérer des points sur une courbe de Bézier.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Billets dans le blog
    1
    Par défaut Repérer des points sur une courbe de Bézier.
    Bonjour,

    Je travaille avec Inkscape pour mes créations de dentelles aux fuseaux.

    Dans Inkscape, il y a une extension python (addnodes) qui permet d'ajouter des nœuds dans une courbe de Bézier en divisant la courbe en de multiples "sous-courbes". Il est possible de placer ces nouveaux nœuds dans la courbe soit en fixant un nombre de nœuds à répartir de façon égale, soit en spécifiant un espacement à respecter entre chaque nœud.

    Ce mode de fonctionnement me pose quelques problèmes car il subdivise la courbe en y faisant apparaître de nouveaux nœuds qui rendent mes modifications ultérieures plus compliquées à gérer.

    J'aimerais, au lieu de diviser la courbe, pouvoir obtenir les coordonnées de chacun "points", mais sans que la courbe soit subdivisée. Ces coordonnées (x,y) de chacune des positions sur la courbe me permettrons de placer un élément vectoriel (un petit cercle par exemple) sur la position qui aurait été occupée par le nouveau nœud.

    En faisant abstraction de Inkscape et ses extension, cela est-il aisément réalisable, sachant que mes compétences mathématiques sont parcellaires concernant les courbes de Bézier ?
    Ce qui m'intéresse est de parvenir à calculer les coordonnées de chacun des "points" au lieu de les placer sur la courbe.

    Voici un exemple de code python dans Inkscape qui ajoute des noeuds dans la courbe de Bézier sélectionnée : https://inkscape.gitlab.io/inkscape/...py_source.html

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Salut

    Il faut fouiller la doc, comme tu as commencer à le faire. C'est un travail long et fastidieux et c'est sûrement pour cela que tu n'as pas encore eu de réponse.
    Essaie de printer (faire des print) des choses pour voir si tu peux faire afficher des choses intéressantes (et in fine, peut être les coordonnées des points).
    Tu peux aussi essayer de mettre un pdb.set_trace() dans la fonction (en ayant importer pdb). Si l'interface tolère cela, ca te donnera la main dans le déboggeur et tu pourras inspecter les objets et leurs attributs. La commande dir est pratique pour ça.

    Tout ceci nécessite tout de même une bonne connaissance de python.

    Bon courage

  3. #3
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Billets dans le blog
    1
    Par défaut Placer des objets le long d'une courbe de Bézier (Inkscape)
    Bonjour lg_53,

    Merci pour ton intervention.

    Le travail sur des courbes de Bézier est très complexe. La compréhension des équations, les différents "traitements" qu'on peu y appliquer et peut-être enfin, la possibilité de programmer quelque chose de "convenable" (lire : qui me convienne).

    J'ai passé de très nombreuses heures à explorer le W3C à propos du SVG, maintenant, je tente de comprendre les courbes de Bézier. Ce n'est pas donné ... même à 7O ans Mes compétences en math sont pour le moins insuffisantes. À l'époque de mes humanités, les courbes de Bézier ... ça n'existait pas, surtout que j'ai suivi mes humanités en sciences commerciales, pas en scientifiques.

    Je continue mes exploration et des tests divers et si l'un ou l'autre a été concluant, je suis encore bien loin de ce que je souhaite obtenir.
    J'ai déjà compris le fonctionnement du couple de fichiers inx et py qui compose les extensions dans Inkscap. C'est déjà ça

    Mais, et je vais explorer cette nouvelle direction, une extension dans Inkscape permet de place des objets le long d'un chemin (pathalongpath.py) (courbe de Bézier). https://github.com/piksels-and-lines...thalongpath.py
    Actuellement, cette extension déforme les objets qui sont placés sur la courbe et cela ne me convient pas. De plus, le positionnement des objets le long de la courbe ne répond qu'à deux critères : un espacement constant ou un nombre défini d'objets.
    J'ai pour ambition de pouvoir choisir les espacements entre les objets selon des progressions arithmétique, géométrique, logarithmique, et bien d'autre possibilités.
    Ce que cette découverte m'a apporté est que les objets sont disposés le long de la courbe, MAIS sans altérer cette courbe, sans y ajouter des nœuds. Et donc, plus besoin de trouver les coordonnées de positionnement des objets.
    Autre chose intéressante qui m'aide dans mes recherches : le positionnement des objets le long de la courbe en fonction d'une distance (le temps) calculée à partir de la longueur de la courbe (facile à déterminer) et du type de répartition choisi.
    Une fois les objets positionnés le long de la courbe, trouver leur centre est relativement trivial

    Toutes ces explications pourraient être utiles à d'autre "chercheurs" qui œuvrent avec Inkscape

    Je retourne au taf

    A+

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux commencer par une introspection des objets.

    Je ferais ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     # Note le changement de nom
     class InspectNodes(inkex.EffectExtension):
         """Extension to split a path by adding nodes to it"""
         def add_arguments(self, pars):
             pars.add_argument("--segments", type=int, default=2,
                               help="Number of segments to divide the path into")
             pars.add_argument("--max", type=float, default=2.0,
                               help="Number of segments to divide the path into")
             pars.add_argument("--method", help="The kind of division to perform")
     
         def effect(self):
             for node in self.svg.get_selected(PathElement):
                print(node)
    Ensuite tu trouves la classe référencée par node (ce qui sera printé) et puis tu rajoutes des print() au fur et à mesure pour voir les valeurs des attributs de l'objet.

    Note que tu n'obtiendras peut-être pas de coordonnées x, y par rapport à l'espace de dessin mais des coordonnées qui se rapportent à la courbe.

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Billets dans le blog
    1
    Par défaut
    Bonjour VinsS,

    Merci pour ta suggestion.
    Je vais creuser de ce côté également.

    A+

Discussions similaires

  1. Relever des points sur une image
    Par PPz78 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/01/2011, 07h28
  2. Placer des points sur une image
    Par vallgui dans le forum WinDev
    Réponses: 9
    Dernier message: 22/01/2008, 15h19
  3. Déplacer un point sur une courbe
    Par Wassim123 dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/09/2007, 13h23
  4. Position sur une Courbe de Bézier
    Par Kurisu dans le forum Mathématiques
    Réponses: 2
    Dernier message: 29/06/2007, 07h49
  5. comments placer des delimiteurs sur une courbe?
    Par brindacier dans le forum MATLAB
    Réponses: 4
    Dernier message: 26/03/2007, 19h19

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