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 :

Plusieurs sphères imbriquées [Débutant]


Sujet :

MATLAB

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut Plusieurs sphères imbriquées
    Bonjour,

    j'essaye de créer des images de sphères plus esthétiques que d'habitude.
    Je veux que les points figurant sur la sphère ne soient pas des points mais d'autres sphères dont le rayon serait contrôlé.

    J'aimerai savoir si pour ce faire on peut conserver la fonction 'sphère' plutôt que de construire manuellement la sphère du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    s1 = 0.5; s2 = 0.5; s3 = 0.5;
     
    fig = figure;
     
    % Sphère 1
    [X,Y,Z] = sphere;
    h1 = surf(X,Y,Z);
    hold on
     
    % Sphère 2
    [s1,s2,s3] = sphere;   % placée aux points de la sphère 1
    h1 = surf(s1,s2,s3);
    Evidemment ici les deux sphères font la même taille et se superposent.

    L'idée reste de faire un code simple et allégé car j'ai parfois 200 points à placer sur la sphère.

    Voici mon code complet :
    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
    R = 100/255; G = 100/205; B = 100/205; RGB = [R G B];
     
    hF = figure;  
    % set(gca,'FontSize',18,'Position',[0 0 1 1])         
    set(hF,'Color','w')
     
    [X,Y,Z] = sphere(100);
    hL = surf(X,Y,Z,'FaceAlpha',0.25,'FaceColor',RGB,'LineStyle','none',...
                    'FaceLighting','phong','AmbientStrength',0.5,...
                    'DiffuseStrength',0.7,'BackFaceLighting','reverselit');
    axis([-1.1 1.1 -1.1 1.1 -1.1 1.1]); axis vis3d; grid off; hold on
    light('Position',[1 1 1]); axis off
     
    plot3(s1,s2,s3,'or','LineStyle','none','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',3)
     
    Xlabel('S_{1}','FontSize',18,'Position',[1.4 -0.1 -2.5])
    Ylabel('S_{2}','FontSize',18,'Position',[-0.40 1.8 -2.5])
    Zlabel('S_{3}','FontSize',18,'Position',[-1.6 1.5 -0.25],'rot',0)
     
    phi = -2*pi:0.01:2*pi;
    plot3(sin(phi),cos(phi),0*phi,'Color','w')
    plot3(0*phi,cos(phi),sin(phi),'Color','w')
    plot3(sin(phi),0*phi,cos(phi),'Color','w')
    plot3([-1 1],[0 0],[0 0],'Color','w')
    plot3([0 0],[-1 1],[0 0],'Color','w')
    plot3([0 0],[0 0],[-1 1],'Color','w')
    Je cherche ainsi à remplacer le 'plot3' par un autre 'sphere'.
    Merci pour votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Pour information j'ai consulté ce lien :

    http://www.developpez.net/forums/d60...ns-croissants/

    traitant du même sujet que moi.
    Cependant la difficulté restante est de fixer la position des nouvelles sphères aux points de coordonnées de la 1ere.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Il suffit d'appliquer un facteur d'échelle puis une translation aux valeurs renvoyées par la fonction sphere.

    Par exemple, pour créer une sphère de rayon 5, centrée sur le point (3,2,-1), tu fais simplement :

    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
    [x,y,z] = sphere(50);
     
    r = 5;
     
    xo = 3;
    yo = 2;
    zo = -1;
     
    x = r*x+xo;
    y = r*y+yo;
    z = r*z+zo;
     
    figure
    surf(x,y,z);
    axis equal
    Cela répond à ta question ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Cela y répond et fonctionne très bien.

    Code final :
    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
    fig = figure;
    set(gca,'FontSize',18,'Position',[0 0 1 1])
    set(fig,'Color','w')
     
    % Sphère principale
    [X,Y,Z] = sphere(100);
    h1 = surf(X,Y,Z);
    hold on
     
    % Importation coordonnées des points sur la sphère principale
    M = impordata('fichier.txt');
    s1 = M(:,1);
    s2 = M(:,2);
    s3 = M(:,3); l = length(s3);
     
    % Sphères secondaires
    for ii = 1:l
     
        [X,Y,Z] = sphere(50);
        r = 0.03;
     
        X = r*X + s1(ii);
        Y = r*Y + s2(ii);
        Z = r*Z + s3(ii);
     
        h1 = surf(X,Y,Z);
        hold on
     
    end
    Je joins également un exemple du résultat final.

    Merci Dut. Toujours un plaisir de traiter avec toi.
    Images attachées Images attachées  

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Si les sphères ont toutes le même diamètre, tu peux simplifier le code comme ceci :

    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
    % Importation coordonnées des points sur la sphère principale
    M = importdata('fichier.txt');
     
    [X,Y,Z] = sphere(50);
    r = 0.03;
     
    X = r*X;
    Y = r*Y;
    Z = r*Z;
     
    % Sphères secondaires
    for ii = 1:size(M,1)
     
        surf(X + M(ii,1), Y + M(ii,2), Z + M(ii,3));
     
    end
    Et il n'y a besoin que d'un seul hold on dans le code.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    En effet.
    J'ai même généralisé le code en fonction et elle tourne pas trop mal.
    Merci !

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

Discussions similaires

  1. Plusieurs classes imbriquées
    Par yann_DZ dans le forum VB.NET
    Réponses: 3
    Dernier message: 30/01/2010, 22h08
  2. Réponses: 15
    Dernier message: 15/09/2008, 19h21
  3. Plusieurs structures imbriquées
    Par swo.line dans le forum C#
    Réponses: 4
    Dernier message: 20/04/2008, 13h29
  4. empêcher un break de sortir de plusieurs boucles imbriquées
    Par quidam66 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 21h52
  5. plusieurs panel imbriqué
    Par bmw13fr dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 21/02/2006, 15h30

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