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 :

Fixer le titre d'une sphère en rotation


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 Fixer le titre d'une sphère en rotation
    Bonjour à tous,

    j'ai réalisé récemment un petit programme pour créer une vidéo d'une sphère en rotation suivant un axe. Durant cette rotation les points situés sur la sphère changent de position. A chaque position correspond un titre spécifique.

    Lorsqu'on crée une sphère (ou un graphique quelconque), on peut sélectionner l’icône "rotate 3D" pour regarder la sphère dans tous les sens : on peut constater que les axes adaptent leur taille en fonction du changement opéré.
    Mon programme prend en compte ce facteur c'est-à-dire que la sphère reste inchangée, ne bouge pas, de plus les axes sont invisibles.
    Je veux juste une sphère et son titre et que le tout évolue dans une boucle sans changement de position.

    Problème : à chaque itération, le titre bouge (de haut en bas), n'est pas fixe. Alors que je n'ai aucun problème sur ma sphère. Mes axes étant invisibles ils restent présents et décalent à chaque fois mon titre.

    j'ai d'ores et déjà essayé title('text', 'Position',[x y z]) , text(x,y,z,'text') , suplabel ... sans succès.

    Ma version de MATLAB : 7.6.0.324(R2008a) sans toolbox !

    Programme :

    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
    clear all; close all; clc
    K = 0:60:360;
    k = 0;
     for ii = 1:length(K)
        x = 1;
        y = sin(ii);
        z = cos(ii);
        az = K(ii); el = 20;  
        fig = figure(1);
        set(fig,'Name',['Rotation de ' num2str(K(ii)) '°'],'NumberTitle','off');
        set(gca,'FontSize',12)
        set(fig,'Color',[1 1 1],'Position',[200 200 600 600]) 
        [x,y,z] = sphere(25);
        surf(x,y,z);
        axis vis3d;grid off;axis off
        hold on
        plot3(x,y,z)
        hold on
        xlabel('S_{1}'), ylabel('S_{2}'), zlabel('S_{3}')
        xlim([-1 1]),ylim([-1 1]),zlim([-1 1])
        title('Text','fontsize',14);
        view(az,el)
        saveas(fig,['rot_' num2str(K(ii)) '_deg'],'fig')
        close(fig)
        Name = ['rot_' num2str(K(ii)) '_deg.fig'];
        open(Name),drawnow,pause(1)
        k = k + 1;
        G(k) = getframe(gcf);
        close all
    end
    movie2avi(G,'test_video.avi','compression','none','fps',15,'quality',100)

    Je sens que la réponse à toute bête mais là je bloque.
    Merci à tous pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Plutôt que de fermer/ouvrir une figure et tout redessiner à chaque itération, met tout en place AVANT ta boucle et ne fait que changer d'angle à l'intérieur :
    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
    clear all; close all; clc
    K = 0:60:360;
     
    fig = figure('Color',[1 1 1],'Position',[200 100 600 600]);
    set(gca, ...
        'Xlim',[-1 1],...
        'Ylim',[-1 1],...
        'Zlim',[-1 1],...
        'FontSize',12,...
        'Nextplot', 'add')
    [x,y,z] = sphere(25);
    surf(x,y,z, 'EdgeColor','none');
    plot3(x,y,z)
    axis vis3d;grid off;axis off
    xlabel('S_{1}'), ylabel('S_{2}'), zlabel('S_{3}')
     
    title('Text','fontsize',14);
    for ii = 1:length(K)
        az = K(ii); el = 20;
        view(az,el)
        set(fig,'Name',['Rotation de ' num2str(K(ii)) '°'],'NumberTitle','off');
     
        Name = ['rot_' num2str(K(ii)) '_deg.fig'];
        saveas(fig,Name,'fig')
        open(Name), drawnow, pause(1), close gcf
        G(ii) = getframe(gcf);
    end
    movie2avi(G,'test_video.avi','compression','none','fps',15,'quality',100)

  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 884
    Points
    52 884
    Par défaut
    Pour ton problème de titre qui oscille verticalement, tu peux utiliser un deuxième objet Axes :

    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
    clear all; close all; clc
    K = 0:15:360;
    k = 0;
    fig = figure('NumberTitle','off','Color',[1 1 1],'Position',[200 200 600 600]);
     
    axt = axes('units','normalized','position',[0 .9 1 .1],'ylim',[0 1],'xlim',[0 1]);
    axis(axt,'off')
     
    ax = axes('FontSize',12);
    grid off;
    xlabel('S_{1}'), ylabel('S_{2}'), zlabel('S_{3}')
    xlim([-1 1]),ylim([-1 1]),zlim([-1 1])
     
    for ii = 1:length(K)
     
        x = 1;
        y = sin(ii);
        z = cos(ii);
        az = K(ii); el = 20;
     
        set(fig,'Name',['Rotation de ' num2str(K(ii)) '°']);
     
        [x,y,z] = sphere(25);
     
        surf(ax,x,y,z);
        hold on
        plot3(x,y,z,'parent',ax)
        hold off
     
        view(ax,az,el)
        axis(ax,'vis3d')
        axis(ax,'off')
     
        text(.5,.5,'Text','fontsize',14,'parent',axt,'horizontalalignment','center')
     
        drawnow
     
    end
    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
    Invité
    Invité(e)
    Par défaut
    Une autre solution sans utiliser de deuxième objet Axes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hTitle = title('Text','fontsize',14);
    pos = get(hTitle, 'Position');
     
    for ii = 1:length(K)
     
        T = view(az,el);
        newPos = inv(T)*[pos(:) ; 0];
        set(hTitle, 'Position', newPos(1:3))
        % ...
     
    end
    Dernière modification par Invité ; 04/03/2013 à 23h26.

  5. #5
    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
    Merci les gars .
    Codes clairs et précis ça m'aide à avancer plus vite donc impeccable.
    Je suis en train d'intégrer vos codes au mien pour voir si ça marche.
    Je vous donne un retour dès que j'ai des résultats.

  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
    Alors,
    voici mon programme (moins simplifié que le précédent). J'ai juste retiré la gestion des matrices créant les points X, Y, Z.
    J'ai pris en compte ici que le commentaire de Dut.
    Winjerome tes idées sont bonnes sauf que je dois régénérer mon titre à chaque boucle; j'ai bien essayé de mettre en mémoire la position du 1er et d'appliquer tes lignes de code aux suivant mais le résultat était le même (sauf erreur de codage de ma part). En ce qui est de la gestion des images je n'y suis pas encore mais je garde pour après .

    Problème : le code marche bien avec la définition de 2 axes. Sauf que 2 restent visibles sur la figure. Comme vous pouvez le voir j'ai tenté de les effacer avec des axis off, set(ax,'visible','off'), sans succès.
    J'ai essayé de supprimer les Xtick et Ytick ainsi que les 'box' ... même résultat.

    Si vous avez des idées je suis preneur.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    clear all; close all; clc
    F = [10 50:50:1700]; ff = length(F);
    K = 0:10:360; l = length(K);
    k = 0; v=1;
    
    for ii = 1:l
       X = 0;
       Y = 0;
       Z = 0;    
      az = K(ii); el = 20;  
      fig = figure(1);
      set(fig,'Name',['Rotation de ' num2str(K(ii)) '°'],...
              'NumberTitle','off','Color',[1 1 1],...
              'Position',[200 200 600 600]);
      set(gca,'FontSize',12,'LooseInset',get(gca,'TightInset'),...
              'DataAspectRatio',[1 1 1],'PlotBoxAspectRatio',[1 1 1])
       
      ax = axes('FontSize',12);
      grid(ax,'off');
      set(ax,'visible','off')
      
      [x,y,z] = sphere(80);
      hs3 = surf(x,y,z);
      set(hs3,'EdgeColor','none','FaceColor',[0.8 0.8 0.8],'FaceLighting',...
              'phong','AmbientStrength',0.5,'DiffuseStrength',0.7,...
              'SpecularStrength',0.05,'SpecularExponent',50,...
              'BackFaceLighting','reverselit');
      camlight left;  hidden on;  alpha(.5);  hold on
      
      plot3(X,Y,Z,'or','LineStyle','none','MarkerEdgeColor','r',...
                          'MarkerFaceColor','r','MarkerSize',4)
    
      t = -2*pi:0.01:2*pi;  RADIUS = 1.0; 
      plot3(RADIUS*sin(t),RADIUS*cos(t),0*t,'Color',[1 1 1],'linewidth',1)
      plot3(0*t,RADIUS*cos(t),RADIUS*sin(t),'Color',[1 1 1],'linewidth',1)
      plot3(RADIUS*sin(t),0*t,RADIUS*cos(t),'Color',[1 1 1],'linewidth',1)
      plot3([-1 1],[0 0],[0 0],'Color',[1 1 1],'linewidth',1)
      plot3([0 0],[-1 1],[0 0],'Color',[1 1 1],'linewidth',1)
      plot3([0 0],[0 0],[-1 1],'Color',[1 1 1],'linewidth',1)
      xlabel('S_{1}'), ylabel('S_{2}'), zlabel('S_{3}')
      xlim([-1 1]),ylim([-1 1]),zlim([-1 1])
      view(ax,az,el);
    
    grid(ax,'off');  
      axis (ax,'vis3d');  
      set(ax,'visible','off')
      
      axt = axes('units','normalized');
      text(.5,1,['P = ' num2str(F(v))  'mW'],'fontsize',14,'parent',axt,'horizontalalignment','center')
      
      grid(axt,'off');
      set(axt,'visible','off')[/B]
    
      saveas(fig,['rot_' num2str(K(ii)) '_deg'],'fig')
      close(fig)
      Name = ['rot_' num2str(K(ii)) '_deg.fig'];
      open(Name),drawnow,pause(1)
      k = k + 1;
      G(k) = getframe(gcf);
      close all
    
      v = v+1;
    end
    movie2avi(G,'test_video.avi','compression','none','fps',5,'quality',100)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Mac52 Voir le message
    je dois régénérer mon titre à chaque boucle;
    Aucun problème, il suffit de rajouter la mise à jour de la propriété String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set(hTitle, ...
        'Position', newPos(1:3), ...
        'String',newTitle)
    )
    Et comme je t'ai dit, tu as beaucoup de choses que tu pourrais mettre avant la boucle.

  8. #8
    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
    Bonjour,

    Winjerome j'ai utilisé ton code pour le programme ci-dessous. Cependant le titre réagit toujours de la même manière : il monte et descend.
    Il y a bien un problème avec la box de la sphère qui décale à chaque fois les coordonnées du titre ... La solution des 2 axes indépendants fonctionne mais les axes restent toujours visibles alors que je souhaite juste voir une sphère et son titre.
    Merci pour votre aide

    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
    43
    44
    45
    46
    47
    clear all; close all; clc; tic
     
    P = [10 50:50:1700]; nbp = length(P);
    D = 0:60:360; dd = length(D);
    k = 0;
     
    for ii = 1:dd
        x = 1;
        y = 1;
        z = 1;
     
        fig = figure(1);
        set(fig,'Name',['Rotation de ' num2str(D(ii)) '°'],...
                'NumberTitle','off','Color',[1 1 1],...
                'Position',[200 200 600 800]);
     
        [x,y,z] = sphere(25); surf(x,y,z)
        hidden on; axis vis3d; grid off; alpha(.5); axis off, hold on
        plot3(x,y,z)
        xlim([-1 1]),ylim([-1 1]),zlim([-1 1])
        hold on
     
        az = D(ii); el = 20;    
        T = view(az,el);    
     
        if ii == 1
        htitle = title('Titre','fontsize',14);
        pos = get(htitle,'Position');
        % newtitle = 'autre titre';
        elseif ii > 1
        htitle = title('Attraction de Polarisation','fontsize',14);    
        newPos = inv(T)*[pos(:);0];
        set(htitle,'Position',newPos(1:3))
        set(htitle,'String','Titre')
        end
     
        saveas(fig,['rot_' num2str(D(ii)) '_deg'],'fig')
        close(fig)
        Name = ['rot_' num2str(D(ii)) '_deg.fig'];
        open(Name),drawnow,pause(1)
        k = k + 1;
        V(k) = getframe(gcf);
        close all
     
    end
    movie2avi(V,'test_video.avi','compression','none','fps',5,'quality',100)
    toc

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Mac52 Voir le message
    Winjerome j'ai utilisé ton code pour le programme ci-dessous.
    Non, ce n'est pas ce que j'ai montré.
    Là tu recrées à chaque itération tous les tracés, fermes toutes les fenêtres... Tout le contraire de ce que j'ai dit dans mon premier message.
    La nouvelle position du SEUL titre doit être calculée à partir de la position de départ avant même d'opérer un seul changement d'angle ; et créé une seule fois avant la boucle, comme tout le reste.

Discussions similaires

  1. fixer un objet dans une scène en rotation
    Par amine84 dans le forum 3D
    Réponses: 1
    Dernier message: 30/08/2009, 03h39
  2. Réponses: 4
    Dernier message: 04/12/2007, 21h29
  3. Rotation d'une sphère avec axes fixes
    Par jmb462 dans le forum OpenGL
    Réponses: 10
    Dernier message: 09/05/2007, 10h44
  4. Fixer les titres de colonnes d'une JTable?
    Par bygui dans le forum Composants
    Réponses: 5
    Dernier message: 13/04/2006, 13h54
  5. [VB6] masquer la barre de titre d'une form
    Par tiboleo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/12/2002, 17h54

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