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

Langage C++ Discussion :

Approximation d'Ellipse par des points


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Approximation d'Ellipse par des points
    Bonjour !

    Je travaille sur un logiciel qui permet d'importer des fichiers au format DXF afin de les afficher en 2D; j'aimerais importer les objets de type Ellipse qui possèdent les informations suivantes :
    - Coordonnées du point central
    - Coordonnée du point de fin de l'axe majeur
    - Le "Ratio of minor axis to major axis" (je ne sais pas si c'est majeur/mineur ou inversement)
    - L'angle de départ
    - L'angle d'arrivée

    Avec ces informations, je dois être capable de trouver une succession de points qui, une fois reliés ensemble, forme une ellipse !
    (En effet, le soft est conçu de manière à ne traiter des objets qui se sont que des succession de points)

    Je travaille avec Qt, mais ici, le soucis est plutôt mathématique; j'ai une base d'algo mais qui ne dessine les ellipse que de façon horizontale et qui a la base est fait pour des cercles.

    Le code :
    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
     
            double distanceDemiMajorAxis = sqrt(pow(ellipse.mx - ellipse.cx, 2) + pow(ellipse.my - ellipse.cy, 2));
     
            double  step = 2*M_PI/100;
            double h = ellipse.cx; // Coordonnée x du centre
            double k = ellipse.cy; // Coordonnée y du centre
            double r = distanceDemiMajorAxis; // Ce paramètre a surement une valeur fausse, mais je ne savait pas trop quoi mettre pour simuler le 'rayon" d'une ellipse, vu qu'elle n'en possède pas
     
     
            for(double theta = 0;  theta < 2*M_PI;  theta+=step)
             {
                double x = h + r * cos(theta);
                double y = k - 0.5 * r * sin(theta);
                ajoutDeCoordonneeDansUnISceneObject(&obj, x, y);
             }
    J'éspère que vous pourrez m'aider !

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 108
    Points
    6 108
    Par défaut
    Bonjour,

    Ton fil aurait plutôt sa place dans le forum suivant :
    http://www.developpez.net/forums/f52...mathematiques/

    Mais voici quand même une réponse.

    Pour une ellipse de centre (0,0), avec un demi-grand axe parallèle à l'axe des abscisses de longueur 2a et un demi-petit axe de longueur 2b, un paramétrage possible est :
    x = a cos t
    y = b sin t
    avec t ∈ R

    C'est pareil qu'un cercle, mais "écarté" avec un facteur a dans le sens des abscisses et avec un facteur b dans le sens des ordonnées.

    a est donné dans ton énoncé.
    b peut se déduire de a et du rapport b/a ("Ratio of minor axis to major axis").

    Maintenant, pour avoir une équation paramétrique d'une ellipse dont on connaît le centre (h, k) et l'angle alpha du grand axe par rapport à l'axe des abscisses, il faut faire un simple changement de repère :
    x' = h + x cos alpha - y sin alpha = h + a cos t cos alpha - b sin t sin alpha
    y' = k + x sin alpha + y cos alpha = k + a cos t sin alpha + b sin t cos alpha

    Remarque : l'équation ci-dessus permet de dessiner l'ellipse dans le sens trigo. Si on veut l'écrire dans le sens horaire, il suffit de remplacer t par -t.

    Tu connais les coordonnées du centre (h, k).
    Tu peux déduire l'angle alpha à partir des coordonnées du centre et du point de fin de l'axe majeur.

    A présent, tu as tout ce qu'il te faut.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour !

    Déjà, merci d'avoir répondu !
    Ensuite, j'avoue ne pas avoir tout très bien saisi : a et b, c'est la longueur des demis axes (grand et petit), ou des grand axe et petit axe ?
    Ensuite, qu'est-ce que tu entends par déduire l'angle ? Je ne comprend pas très bien comment déduire un ange entre deux points !
    De plus, est-ce que l'angle est en radian ou en degré ? (je suppose en degré, vu que tu n'as pas précisé, mais je n'en suis pas sur...)

    Ma version du programme pour le moment (qui ne parle pas du tout):
    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
     
        ISceneObject obj;
     
        double distanceDemiMajorAxis = sqrt(pow(ellipse.mx - ellipse.cx, 2) + pow(ellipse.my - ellipse.cy, 2));
        double majorAxis = distanceDemiMajorAxis * 2;
        majorAxis /= 2; // C'est pas super propre, mais c'était pour test; c'est le demi grand axe
        double minorAxis = majorAxis * ellipse.ratio;
        minorAxis /= 2; // c'est le demi petit axe
     
        double  step = 2*M_PI/100;  // C'est le step de discrétisation
        for(double theta = 0;  theta < 2*M_PI;  theta+=step)
        {
            double alpha;
     
            alpha = ellipse.angle2; /// Là c'est un peu random, je savais pas quoi mettre pour remplacer alpha... (angle1 c'est l'angle de départ, angle2 c'est l'angle d'arrivee)
     
            double x = ellipse.cx + majorAxis * cos(step) * cos(alpha) * step - minorAxis * sin(step) *  sin(alpha);
            double y = ellipse.cy + majorAxis * cos(step) * step * sin(alpha) + majorAxis * sin(step) * cos(alpha);
     
            ajoutDeCoordonneeDansUnISceneObject(&obj, x, y); // méthode pour ajouter les coordonnées du point pour les traitement à posteriori.
        }
        return obj;

  4. #4
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 108
    Points
    6 108
    Par défaut
    Citation Envoyé par Arkhemval Voir le message
    a et b, c'est la longueur des demis axes (grand et petit), ou des grand axe et petit axe ?
    Erreurs d'étourderie de ma part :
    • Le demi-grand axe a une longueur a et pas 2a.
    • Le demi-petit axe a une longueur b et pas 2b.


    Citation Envoyé par Arkhemval Voir le message
    Ensuite, qu'est-ce que tu entends par déduire l'angle ? Je ne comprend pas très bien comment déduire un ange entre deux points !
    Si on note C le centre de ton ellipse et M le "point de fin de l'axe majeur", le vecteur CM a un argument alpha.
    La valeur absolue de alpha est l'angle entre la droite (CM) et l'axe des abscisses.
    Pour déduire l'argument alpha des coordonnées cartésiennes du vecteur CM, tu peux utiliser une des formules qui se trouvent sur Wikipédia :
    https://fr.wikipedia.org/wiki/Coordo...cart.C3.A9sien

    Citation Envoyé par Arkhemval Voir le message
    De plus, est-ce que l'angle est en radian ou en degré ? (je suppose en degré, vu que tu n'as pas précisé, mais je n'en suis pas sur...)
    Les formules que j'ai écrites sont aussi valables quand tout est en radians que quand tout est en degrés.
    Si tu utilises <cmath>, tout est en radians.

    A part ça, pour ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double minorAxis = majorAxis * ellipse.ratio;
    minorAxis /= 2; // c'est le demi petit axe
    La division par deux est en trop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(double theta = 0;  theta < 2*M_PI;  theta+=step)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alpha = ellipse.angle2; /// Là c'est un peu random, je savais pas quoi mettre pour remplacer alpha... (angle1 c'est l'angle de départ, angle2 c'est l'angle d'arrivee)
    Dans ton énoncé, quand j'avais lu "angle de départ" et "angle d'arrivée", j'avais interprété que theta irait de l'angle de départ à l'angle d'arrivée et donc qu'il ne fallait tracer qu'une portion de l'ellipse.
    Si j'ai mal interprété, je ne sais pas ce que signifient "angle de départ" et "angle d'arrivée".
    En tout cas, alpha doit être égal à l'argument du vecteur CM.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double x = ellipse.cx + majorAxis * cos(step) * cos(alpha) * step - minorAxis * sin(step) *  sin(alpha);
    double y = ellipse.cy + majorAxis * cos(step) * step * sin(alpha) + majorAxis * sin(step) * cos(alpha);
    Dans les deux lignes, il y a une multiplication par step en trop.
    Dans la deuxième, à la place du deuxième majorAxis, c'est minorAxis.
    A part ça, il ne faut pas utiliser step mais theta. Sinon, tu vas écrire toujours le même point.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2008, 16h16
  2. Comment changer des virgules par des points
    Par solorac dans le forum Excel
    Réponses: 2
    Dernier message: 30/07/2007, 10h38
  3. Réponses: 6
    Dernier message: 03/05/2007, 13h42
  4. approximation de courbe par des segments
    Par dseguret dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 27/02/2007, 21h03
  5. Surface passant par des points
    Par Youn05 dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/02/2007, 13h28

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