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 :

Création d'une surface fractale en 3D


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Création d'une surface fractale en 3D
    Bonjour !
    Alors voilà, effectivement je débute un peu sur MATLAB, et j'essaie tant bien que mal de trouver une solution à mon problème mais ça capote un peu maintenant !
    L'idée est de prendre un premier plan, de forme carrée, et de le découper en 4, de prélever chaque point (des Z, donc la troisième coordonnée) pour y ajouter une valeur. De recommencer avec chaque carré créé et ainsi de suite, de façon récursive. J'ai déjà réalisé le travail en 2D, avec une ligne, mais mes lacunes en 3D me bloquent un peu. Pour essayer de faire simple, j'aimerai trouver un moyen de prélever les Z en question a chaque étape de découpage afin de pouvoir y ajouter ma valeur, bien sûr à chaque étape encore, on conserve les points précédemment trouvés mais leur position sur la grille change puisque l'on découpe cette grille. Voilà, j'ai essayé avec la fonction "findobj" , de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FZ = get(findobj('-property','ZData'),'ZData');
    mais ça ne me donne rien. ALors si quelqu'un à une idée sur la manière dont je pourrais me débrouiller pour réaliser mon affaire, ça m'intéresse !
    Voilà toute réponse est la bienvenue, même pour juste me dire de changer de façon de voir le problème !
    Bonne journée à tous !

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    findobj('-property','ZData')
    Ça sert à retrouver les données ayant générés un graphe. Mais as-tu un graphe ? Sous quelle forme sont tes données ?

    une piste: j'ajoute une valeur à tous les éléments, puis une à chaque quart de la matrice, puis une à chaque 16ème etc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    x= zeros(2^6,2^6); 
    for k=0:4
    for i= 1:k
    for j= 1:k
        ii= 1+(i-1)*2^(k) : (i)*2^(k);
        jj= 1+(j-1)*2^(k): j*2^(k)
        x(ii,jj)= x(ii,jj) + rand(length(ii),length(jj))
    end;end;end
    imagesc(x):
    Si la dimension de la matrice n'est pas une puissance de 2, il va falloir interpoler

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour ! alors,
    Je n'ai pas de données au départ, seulement un plan avec Z=0, et X=[0 1], Y=[0 1].
    L'idée de mon travail est donc d'ajouter au premier pas de temps une valeur aléatoire gaussienne multipliée par le facteur 1/sqrt(0.8) (par exemple) aux quatre points qui définissent mon "carré". Ensuite découper ce carré en quatre carrés par le milieu, et de faire la même chose avec les points créés, c'est à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X=[0 0.5 1]
    Y=[0 0.5 1]
    (je fais meshgrid(X,Y) à ce moment)
    et Z = [rand(1)*A *la valeur correspondant au point en Z sur le plan aux coordonnées X,Y= (0.5,0)* Rand(1)*A;
    trois valeurs de Z correspondant aux coordonnées (dans l'ordre) : (0,0.5) (0.5,0.5) (1,0.5)
    rand(1)*A *la valeur (...) X,Y=(0.5,1) Rand(1)*A]
    c'est pas trop clair en gros, mes Z sont la hauteur sur le graphique à ce moment là pour mes nouveaux points donnés par la découpe des axes X et Y.
    là tu as un plan type de ce que j'ai comme départ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    X=[0 1]
    Y=[0 1]
    [X,Y]=meshgrid(X,Y)
    Z=X*0
    N=length(Z)
    Z(1,1)=rand(1)
    Z(1,N)=rand(1)
    Z(N,1)=rand(1)
    Z(N,N)=rand(1)
    mesh(X,Y,Z)
    tout mon problème réside à savoir comment obtenir a chaque pas les Z que j'ai quand je découpe mon plan en carrés de plus en plus petits

    En 2D le boulot donne :
    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
    clear all
    close all
    a=rand(1);
    b=rand(1);
    recurse(0,a,1,b,2,0,0,4)
    FY = get(findobj('-property','XData'),'YData');
    FX = get(findobj('-property','XData'),'XData');
    %FZ = get(findobj('-property','ZData'),'ZData');
    %FX=FX';
    %FY=FY';
    FX = cell2mat(FX);
    FX = [0;FX;1];
    FY = [a;FY;b];
    FY= cell2mat(FY);
    [FX,ai]=sort(FX);
    FY=FY(ai);
    figure()
    plot(FX,FY)
    avec recurse la fonction :
    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
    function [c,o] = recurse(x1,y1,x2,y2,i,c,o,n) 
    %i=i+1
    %plot(x1,y1,'+',x2,y2,'+')
    x3= (x1+x2)/2;
    y3= (y1+y2)/2+rand(1)*1/sqrt(81/100);
    c=x3
    o=y3
    M(i)=x3
    N(i)=y3
    hold on
    plot(c,o,'+')
    %plot(x1,y1,'+',c,o,'+',x2,y2,'+')
    %plot()
     
     
    %hold on
    %plot(x3,y3,x2,y2,type('l'))
    if i>n;
        return 
    else
        recurse(x1,y1,x3,y3,i+1,c,o,n);
        recurse(x3,y3,x2,y2,i+1,c,o,n);
     
    end
    que l'on peut modifier surtout en modifiant la racine carrée.
    La même chose en 3d, c'est le but

    En dehors de ça, ton code à l'air pas mal ! mais imagesc(x) ne fonctionne pas chez moi (j'ai MATLAB de base)
    Voilà, mais ton idée d'ajouter un élément à chaque 16éme ainsi de suite, à l'air d'ouvrir la porte à une solution !

    désolé pourles balises code :/

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Petit ajout :
    j'ai déjà essayé de diviser mes abscisses en 2^2+1 éléments, afin de diviser plus facilement mon plan. Mais si je met des valeurs aux quatre côtés, il n'y a des valeurs que pour ces cotés là et non pas les valeurs de la surface en tois points X,Y
    Je ne suis pas très clair , avec ça ça s'explique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function [Z] = repartition(n)
    X=[0:1/(2^n+1):1]
    Y=[0:1/(2^n+1):1]
    [X,Y]=meshgrid(X,Y)
    Z=X*0
    N=length(Z)
    Z(1,1)=rand(1)
    Z(1,N)=rand(1)
    Z(N,1)=rand(1)
    Z(N,N)=rand(1)
    mesh(X,Y,Z)
     
    end
    Voilà, là on voit que mon plan s'écrase en 0 pour tout autre point que les côtés !
    :/

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    j'ai déjà essayé de diviser mes abscisses en 2^2+1 éléments
    Dans mon code, je stocke les valeurs Z dans une matrice x, et donc
    x(p,q)= Z(p /2^n,q /2^n). ça évite de s’embêter avec 3 variables et avec meshgrid. Mais ça ne marche que pour une base 2, alors que l'interpolation marcherait pour n'importe quelle base. De plus, ça limite la profondeur de la récurrence à log2(size(x)).
    Il vaut donc mieux rester en meshgrid non ?

    Voilà, là on voit que mon plan s'écrase en 0 pour tout autre point que les côtés !
    Je suis pas sur de saisir, mais ça me fait penser à deux choses:

    1/ regarde bien ma ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ii= 1+(i-1)*2^(k) : (i)*2^(k);
    Elle crée les indices du i-ème bloc, pour ajouter la valeur à toutes les cases du bloc plutôt qu'à une seule case.

    2/ il faut surement ajuster la variance des Gaussiennes que tu sommes en fonction de dx pour que le champ généré existe en "temps continu" et qu'il n'explose pas en certaines valeurs. Je veux dire:
    1/sqrt(0.8) pour tout le monde
    1/sqrt(0.8)/2 pour les 4*4
    1/sqrt(0.8)/4 pour les 16*16
    sinon la limite risque de ne pas exister, ce qui peut expliquer ton écrasage

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Alors, déjà merci pour tout ça, c'est gentil de t'y pencher
    Quand je dis que mon plan "s'écrase en 0", c'est juste pour signifier que sur le dessin toutes les valeurs de Z hormis les quatre bords, sont égales à 0, aucun calcul n'est encore fait, alors que mon premier but est d'obtenir les valeurs de Z pour la surface générée avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    X= [0 1]
    Y= [0 1]
    [X,Y]=meshgrid(X,Y)
    Z=X*0
    N=length(Z)
    Z(1,1)=rand(1)
    Z(1,N)=rand(1)
    Z(N,1)=rand(1)
    Z(N,N)=rand(1)
    mesh(X,Y,Z)
    enfait, il faut que j'arrive a obtenir la même surface, avec une grille de X,Y non pas comprise entre 0 et 1, mais entre 0 et (2^n)+1 découpes.
    je voudrais cette surface sur une grille bien plus découpée, afin de pouvoir obtenir les Z de chaque point (X,Y) et ainsi les modifier à ma convenance.

    Quant à l'ajustement de la variance de la gaussienne, je ne saisis pas bien ce que tu veux dire, mais effectivement certains points seront remaniés un plus de fois que d'autres

    Si tu vois un moyen d'obtenir cette surface et puis de changer les grilles X,Y sans modifier la surface, tu as ma première solution
    Le but de tout ça est de vérifier que plus le 1/sqrt(x) est élevé, plus la surface finale est douce, et plus 1/sqrt(x) est faible, plus la surface est abrupte.
    Voilà voilà

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/09/2012, 11h24
  2. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  3. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37
  4. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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