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

Delphi Discussion :

courbe de bezier


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut courbe de bezier
    bonjour
    comment calculer les point de contrôle d'un courbe de bézier
    je connais point depart point arrive et centre du rayon
    car je voudrais transcrire cette courbe en path svg genre M.. .. C point controle 1 point controle 2 et point arrive

    je joint un petit croquis
    merci
    Images attachées Images attachées  

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,

    tu as quelques éléments ici et

    même si cela ne répond pas complètement à ta question

    A+
    Charly

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 062
    Points : 41 023
    Points
    41 023
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Vu l'idée du SVG je pense que la lecture qui "le fait" doit être http://svground.fr/paths.php#quadra ou http://svground.fr/paths.php#cubi
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    bonjour
    merci pour aide
    j'ai regarder a tous vos liens qui sont très intéressant

    mais je commence a avoir mal a la tête avec toute ces formules
    donc si je comprend bien meme si on as le point depart le point arrive
    le centre du cercle et le rayon ce n'est pas simple de retrouver les 2 point de contrôle
    car dans tous les exemple vous fournissez les 4 points pour changer la courbe
    et moi je veux seulement algorithme pour la trouver
    donc si vous aviez quelque chose de plus je vous en remercie d'avance

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 062
    Points : 41 023
    Points
    41 023
    Billets dans le blog
    62
    Par défaut
    Faites comme moi, téléchargez InkScape
    dessinez votre courbe puis sauvegardez vous aurez alors un fichier SVG
    Ouvrez-le avec un éditeur de texte

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!-- Created with Inkscape (http://www.inkscape.org/) -->

    <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    width="210mm"
    height="297mm"
    viewBox="0 0 210 297"
    version="1.1"
    id="svg8"
    inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
    sodipodi:docname="dessin-1.svg">
    <defs
    id="defs2" />
    <sodipodi:namedview
    id="base"
    pagecolor="#ffffff"
    bordercolor="#666666"
    borderopacity="1.0"
    inkscape:pageopacity="0.0"
    inkscape:pageshadow="2"
    inkscape:zoom="0.35"
    inkscape:cx="-64.285714"
    inkscape:cy="560"
    inkscape:document-units="mm"
    inkscape:current-layer="layer1"
    showgrid="false"
    inkscape:window-width="1600"
    inkscape:window-height="837"
    inkscape:window-x="-8"
    inkscape:window-y="-8"
    inkscape:window-maximized="1" />
    <metadata
    id="metadata5">
    <rdf:RDF>
    <cc:Work
    rdf:about="">
    <dc:format>image/svg+xml</dc:format>
    <dc:type
    rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
    <dc:title></dc:title>
    </cc:Work>
    </rdf:RDF>
    </metadata>
    <g
    inkscape:label="Calque 1"
    inkscape:groupmode="layer"
    id="layer1">
    <path
    style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
    d="M 0.75595238,295.48809 74.083332,294.73215 89.202381,287.17261 C 107.9954,274.27637 92.37824,269.576 86.934523,262.22619"
    id="path1088"
    inkscape:connector-curvature="0"
    sodipodi:nodetypes="cccc" />
    </g>
    </svg>
    Il vous "suffira" de lire dans les différents path les valeurs de d
    d="M 0.75595238,295.48809 74.083332,294.73215 89.202381,287.17261 C 107.9954,274.27637 92.37824,269.576 86.934523,262.22619"
    afin d'essayer de comprendre où mettre vos valeurs (je sais c'est empirique mais cela donne une idée)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    merci
    mais j'utilise déjà inkscape
    mais je voudrais savoir le calculer moi meme

    mon programme va se servir du viewer de

    SVG Image in TPicture

    home page: http://www.mwcs.de
    email : martin.walter@mwcs.de
    mais il reconnait très mal les curves avec le( a 00 00 00 00)
    qui donne en premier rayon en X rayon en Y rotation sens du rayon sens du rayon et point final
    cette fonction n’était pas dur a mettre en oeuvre

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    bonjour
    je viens de trouver un programme qui doit normalement trouver les point de controle
    mais le problème il est écris en C
    qui peux m'aider a traduire

    Code C : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    /* Author : Vincent Tan Wai Lip
       URL : <a href="http://polymathprogrammer.com/" target="_blank">http://polymathprogrammer.com/</a>
    */
     
    #include <stdio.h>
     
    typedef struct tagVector3D{
       double x,y,z;
    }Vector3D;
     
    Vector3D pos[4];
     
    main(){
       int i, result;
       char response;
       double u,v;
     
       do {
          for (i=0;i<4;++i){
             pos[i].x = 0.0; pos[i].y = 0.0; pos[i].z = 0.0;
          }
     
          printf("Enter the points, three components at a time (x y z) with a space between them.");
          printf("\nEnter the first point : ");
          scanf("%lf",&(pos[0].x));
          scanf("%lf",&(pos[0].y));
          scanf("%lf",&(pos[0].z));
     
          printf("\nEnter u : ");
          scanf("%lf",&u);
          printf("Enter the second point : ");
          scanf("%lf",&(pos[1].x));
          scanf("%lf",&(pos[1].y));
          scanf("%lf",&(pos[1].z));
     
          printf("\nEnter v : ");
          scanf("%lf",&v);
          printf("Enter the third point : ");
          scanf("%lf",&(pos[2].x));
          scanf("%lf",&(pos[2].y));
          scanf("%lf",&(pos[2].z));
     
          printf("\nEnter the fourth point : ");
          scanf("%lf",&(pos[3].x));
          scanf("%lf",&(pos[3].y));
          scanf("%lf",&(pos[3].z));
     
          /* I understand the redundancy of passing global variables into
          the function when there's no need to. I am concentrating on the function,
          not the program semantics. Globals were used so that there are less
          function arguments. */
          result = interpolate(pos[0].x, pos[0].y, pos[0].z,
                               u, pos[1].x, pos[1].y, pos[1].z,
                               v, pos[2].x, pos[2].y, pos[2].z,
                               pos[3].x, pos[3].y, pos[3].z);
     
          if (result == 1){
             printf("\nThe calculated control points are:");
             for (i=0;i<4;++i){
                printf("\nPoint %d (%4.5f   %4.5f   %4.5f)", i+1, pos[i].x, pos[i].y, pos[i].z);
             }
          }
          else {
             printf("\nUnable to calculate Bezier control points.");
          }
     
          printf("\n\nDo again? (Y/N) ");
          scanf(" %c", &response);
       } while (response == 'Y' || response =='y');
    }
     
    int interpolate(double p0x, double p0y, double p0z,
                           double u, double p1x, double p1y, double p1z,
                           double v, double p2x, double p2y, double p2z,
                           double p3x, double p3y, double p3z)
    {
    	double a=0.0, b=0.0, c=0.0, d=0.0, det=0.0;
    	Vector3D q1, q2;
     
    	if ( (u<=0.0) || (u>=1.0) || (v<=0.0) || (v>=1.0) || (u>=v) )
          return 0; /* failure */
     
    	a = 3*(1-u)*(1-u)*u; b = 3*(1-u)*u*u;
    	c = 3*(1-v)*(1-v)*v; d = 3*(1-v)*v*v;
    	det = a*d - b*c;
    	/* unnecessary, but just in case... */
    	if (det == 0.0) return 0; /* failure */
     
    	pos[0].x = p0x; pos[0].y = p0y; pos[0].z = p0z;
     	pos[3].x = p3x; pos[3].y = p3y; pos[3].z = p3z;
     
    	q1.x = p1x - ( (1-u)*(1-u)*(1-u)*p0x + u*u*u*p3x );
    	q1.y = p1y - ( (1-u)*(1-u)*(1-u)*p0y + u*u*u*p3y );
    	q1.z = p1z - ( (1-u)*(1-u)*(1-u)*p0z + u*u*u*p3z );
     
    	q2.x = p2x - ( (1-v)*(1-v)*(1-v)*p0x + v*v*v*p3x );
    	q2.y = p2y - ( (1-v)*(1-v)*(1-v)*p0y + v*v*v*p3y );
    	q2.z = p2z - ( (1-v)*(1-v)*(1-v)*p0z + v*v*v*p3z );
     
    	pos[1].x = d*q1.x - b*q2.x;
    	pos[1].y = d*q1.y - b*q2.y;
    	pos[1].z = d*q1.z - b*q2.z;
    	pos[1].x /= det;
    	pos[1].y /= det;
    	pos[1].z /= det;
     
    	pos[2].x = (-c)*q1.x + a*q2.x;
    	pos[2].y = (-c)*q1.y + a*q2.y;
    	pos[2].z = (-c)*q1.z + a*q2.z;
    	pos[2].x /= det;
    	pos[2].y /= det;
    	pos[2].z /= det;
     
    	return 1; /* success */
    }

    merci

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 062
    Points : 41 023
    Points
    41 023
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par tintin62 Voir le message
    mon programme va se servir du viewer de SVG Image in TPicture
    Ah d'accord on s'est mal compris car le framework FMX propose un composant TPath qui fait très bien le boulot (et même pour de la 3D)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    bonjour
    la commande path elle sait sauvegarder en SVG ou seulement le lire

    merci

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 062
    Points : 41 023
    Points
    41 023
    Billets dans le blog
    62
    Par défaut
    Si je sais que l'on peut charger un SVG je n'ai aucune information sur la sauvegarde
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    bonjour
    viens de decoder le programme C
    le plus dur etant les formules avec leur priorite
    par contre j'ai du mal a fixer les parametre de U et V
    vous joint une petit programme C refait en delphi7

    Ps:attention il cree un fichier Calcul.svg sur le repertoire des fois
    que vous auriez un fichier du meme nom
    Fichiers attachés Fichiers attachés

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 211
    Points : 55
    Points
    55
    Par défaut
    bonjour
    bon un peu trop complique les points contrôle avec la Path svg C ......
    donc revenu avec la fonction A du svg qui est très facile a mettre en oeuvre
    j'ai contourner le bug du composant svg en commençant par le point de fin pour finir au debut
    et sa marche
    vous joint bientôt un prototype

    merci a tous

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