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

MATLAB Discussion :

Obtenir une surface en faisant tourner une courbe autour d'un axe


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut Obtenir une surface en faisant tourner une courbe autour d'un axe
    Bonjour tout le monde,
    Je veux passer d'une courbe 2D (2 dimensions) à une courbe 3D en respectant bien sure une symétrie de révolution.
    En effet, le programme suivant trace une coupe (courbe en bleu) d'une surface 3D (surface que je souhaite tracer) dans un plan (W,Z) avec Z représente le 3eme axe du repère cartésien (X,Y,Z) et W un axe donnée du plan (XY) et passant par l'origine. la droite en rouge présente l'axe de symétrie.

    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
    clear all
    close all
     
    MA=40;
    anglcentral=45;
    angl = 0:0.1:90;
    nn = 1;
    for ang = angl
        if ang < 2.5
            F(nn) = MA;
        elseif (ang >= 2.5)&(ang <= 7)
            F(nn) = 33 - 25*log10(ang) ;
        elseif (ang > 7)&(ang <= 9.2)
            F(nn) = 12 ;
        elseif (ang > 9.2)&(ang <= 48)
            F(nn) = 36 - 25*log10(ang);
        else
            F(nn) = -6 ;
        end
        nn = nn + 1;
    end
    G=[fliplr(F) F(2:end)];
    Gx=[-fliplr(angl) angl(2:end)];
    abscis = Gx + anglcentral;
    ind1 = find(abscis==0);
    ind2 = find(abscis==90);
    G1 = abscis(ind1:ind2);
    G2 = G(ind1:ind2);
     
    % convertir aux coordonnées cartésiennes
    xM =  G2.*sin(G1*pi/180);
    yM = G2.*cos(G1*pi/180);
    xM0 =  G2.*sin(anglcentral*pi/180);
    yM0 = G2.*cos(anglcentral*pi/180);
     
    figure
    plot(xM,yM);hold on
    plot(xM0,yM0,'r');
    grid
    xlabel('W');
    ylabel('Z');
    axis square
    Donc ce que j'aimerai tracer, c'est une surface 3D obtenue en tournant la courbe bleue autour de la droite rouge et ensuite la représenter dans le repère (X,Y,Z). l'axe de symetrie de cette courbe 3D sera (dans le programme finale) une droite passant par l'origine et par un point (X0,Y0,Z0).

    Je vous remercie d'avance pour toute réponse qui pourra m'aider à résoudre ce problème.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Tu as réussi à résoudre ton problème ? Tu as des pistes ? Des erreurs ?

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    Non je cherche encore.
    Je te tiens au courant

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 307
    Points : 52 887
    Points
    52 887
    Par défaut
    Tu peux essayer la fonction CYLINDER pour générer la surface autour de l'axe Z et appliquer ensuite une matrice de transformation pour la positionnner autour de son axe réel de révolution.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    Merci Dut pour ton idée...
    en Utilisant la fonction cylinder, j'ai pu tracer une surface 3D avec (OZ) comme axe de symétrie. Maintenant, je voulais faire une double rotation (azimuth + elevation) afin d'incliner ma surface. mais malheureusement je n'arrive pas !!!
    voilà le code pour un exemple simple
    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
    clear all
    close all
    clc
     
    t=0:pi/10:pi/2;
    xM = sin(t);
     
     
    % génération d'une surface avec cylinder
    [X,Y,Z] = cylinder(xM);
    figure;
    surf(X,Y,Z);
     
     
    % double rotation (elevation + azimuth)
    [az,el,r] = cart2sph(X,Y,Z);  
    el0 = 45*pi/180;
    az0 = 90*pi/180;
    [xu,yu,zu] = sph2cart(az+az0,el+el0,r);
    figure;
    surf(xu,yu,zu);

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 307
    Points : 52 887
    Points
    52 887
    Par défaut
    Tu peux soit utiliser la fonction HGTRANSFORM, soit écrire la matrice de passage entre le repère initiale et le repère finale en utilisant les cosinus directeurs.

  7. #7
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    J'ai essayé ton idée mais helas je ne trouves pas le bon resultat !!
    voilà un exemple de code qui "doit faire" la rotation d'un point (x1,y1,z1) autour d'un axe définit par un angle d'elevation thm et un angle d'azimuth phm
    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
    function [x2,y2,z2] = rotation_axe(x1,y1,z1,thm,phm)
     
     
    R = sqrt(x1*x1 + y1*y1 + z1*z1);
    phi1 = atan2(y1,x1);
    R1 = sqrt(x1*x1 + y1*y1);
    theta1 = atan2(R1,z1);
     
     
    theta2 = 2*(thm*pi/180) - theta1;
    phi2 = 2*(phm*pi/180) - phi1;
    R2 = R1*sin(theta2)/sin(theta1);
    x2 = (x1*cos(phi2-phi1) - y1*sin(phi2-phi1))*(R2/R1);
    y2 = (x1*sin(phi2-phi1) + y1*cos(phi2-phi1))*(R2/R1);
    z2 = R*cos(theta2);
     
    xm = R*sin(thm*pi/180)*cos(phm*pi/180);
    ym = R*sin(thm*pi/180)*sin(phm*pi/180);
    zm = R*cos(thm*pi/180);
     
    plot3([0 x1],[0 y1],[0 z1]);hold on;
    plot3([0 x2],[0 y2],[0 z2],'r');
    plot3([0 xm],[0 ym],[0 zm],'k');
    grid
    axis equal
    xlabel('x');ylabel('y');zlabel('z');
    tu peux essayer rotation_axe(1,0,1,0,0) et rotation_axe(1,0,1,0,90)

  8. #8
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    C'est bon j'ai réglé mon problème .... ouuf
    L'idée est très simple, il suffit d'utiliser la matrice de passage avec les angles d'Euler. En plus j'avais fait ca en Mécanique du solide à la fac.
    Merci a toi Dut pour l'idée d'utiliser la fonction cylinder

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

Discussions similaires

  1. [XL-2010] ComboBox sur une feuille Excel faisant référence à une plage nommée
    Par formabox dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/05/2015, 18h08
  2. Réponses: 11
    Dernier message: 30/05/2009, 21h21
  3. Réponses: 1
    Dernier message: 11/02/2009, 06h33
  4. [Access] Expression avec une clause SQL faisant appel à une variable
    Par elgringo2007 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/06/2006, 13h02
  5. Réponses: 8
    Dernier message: 10/05/2006, 20h56

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