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

Téléchargez Discussion :

[Fractales 2/5] Jeu du chaos - Chaos Game (2D/3D)


Sujet :

Téléchargez

  1. #1
    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 : 53 166
    Points
    53 166
    Par défaut [Fractales 2/5] Jeu du chaos - Chaos Game (2D/3D)


    suite de mon approche du monde des fractales. Aujourd'hui : le Chaos Game (j'espère ne pas dire trop de bêtise )

    Le code permettant de générer les formes :

    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
    function [x,y,c] = chaosgame(form,N)
    %CHAOSGAME
    %
    %
     
    % Author : Jerome Briot (Dut)
    % Contact : dutmatlab#yahoo#fr -or- briot#cict#fr
    % Profil : www.mathworks.com/matlabcentral/newsreader/author/94805
    %        : www.developpez.net/forums/u125006/dut/
    %
    % Version : 1.0 - 03 Sep 2009
    %
     
    % MATLAB : 7.6.0.324 (R2008a)
    % System : Linux 2.6.24-24-generic
    %
     
    error(nargchk(1,2,nargin));
     
    if nargin == 1
        N = 75000;
    end
     
    m = min(form.polyg,[],2);
    M = max(form.polyg,[],2);
     
    [x,y] = meshgrid(linspace(m(1),M(1),10),linspace(m(2),M(2),10));
     
    in = inpolygon(x(:),y(:),form.polyg(1,:),form.polyg(2,:));
    idxi = find(in(:));
    idx = randperm(numel(idxi));
    idxi = idxi(idx(1));
     
    xs = x(idxi(1));
    ys = y(idxi(1));
     
    sp = size(form.polyg,2);
     
    idx = randperm(sp);
     
    x = zeros(1,N);
    y = zeros(1,N);
    c = zeros(1,N);
     
    if form.keeppolyg
        x(1:sp) = form.polyg(1,:);
        y(1:sp) = form.polyg(2,:);
        c(1:sp) = 1:sp;
        k = sp+1;
    else
        k = 1;  
    end
     
    x(k) = form.frac*form.polyg(1,idx(1))+(1-form.frac)*xs;
    y(k) = form.frac*form.polyg(2,idx(1))+(1-form.frac)*ys;
    c(k) = idx(1);
     
    for n=k+1:N
        idx = randperm(sp);
        x(n) = form.frac*form.polyg(1,idx(1))+(1-form.frac)*x(n-1);
        y(n) = form.frac*form.polyg(2,idx(1))+(1-form.frac)*y(n-1);
        c(n) = idx(1);
    end
    form est une structure avec les champs suivant
    • form.name
    • form.polyg
    • form.frac
    • form.keeppolyg


    En prenant l'exemple du Triangle de Sierpinski (voir le paragraphe qui commence par "Or more simply:"), la structure form est :

    • form.name = 'Sierpinski triangle';
    • form.polyg = [0 1 .5 ; 0 0 sqrt(2)/2];
    • form.frac = .5;
    • form.keeppolyg = true;


    Le champs keeppolyg sert juste à spécifier si les points du polygone de départ doivent être conservés ou non pour le tracé final.

    N est bien entendu le nombre d'itération donc le nombre de points au final sur le tracé.

    Pour tracer le résultat :
    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
    function h = drawchaosgame(x,y,c)
    %DRAWCHAOSGAME
    %
    %
     
    % Author : Jerome Briot (Dut)
    % Contact : dutmatlab#yahoo#fr -or- briot#cict#fr
    % Profil : www.mathworks.com/matlabcentral/newsreader/author/94805
    %        : www.developpez.net/forums/u125006/dut/
    %
    % Version : 1.0 - 03 Sep 2009
    %
     
    % MATLAB : 7.6.0.324 (R2008a)
    % System : Linux 2.6.24-24-generic
    %
    error(nargchk(2,3,nargin));
     
    figure('color','w')
     
    if nargin == 3
     
        mc = max(c);
     
        hold on
        cmap = hsv(mc);
        cmap = cmap(randperm(mc),:);
     
        for n = 1:mc
            idx = c==n;
            h(n) = plot(x(idx),y(idx),'k.');
            set(h(n),'color',cmap(n,:));
        end
     
    else
        h = plot(x,y,'k.');
    end
    axis equal off
    Quelques formes prédéfinies :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    function form = selectchaosgameform(n)
    %SELECTCHAOSGAMEFORM
    %
    %
     
    % Author : Jerome Briot (Dut)
    % Contact : dutmatlab#yahoo#fr -or- briot#cict#fr
    % Profil : www.mathworks.com/matlabcentral/newsreader/author/94805
    %        : www.developpez.net/forums/u125006/dut/
    %
    % Version : 1.0 - 03 Sep 2009
    %
     
    % MATLAB : 7.6.0.324 (R2008a)
    % System : Linux 2.6.24-24-generic
    %
     
    error(nargchk(1,1,nargin));
     
    fa = {'Sierpinski carpet'
        'Sierpinski triangle'
        'Sierpinski Hexagon'
        'Sierpinski Pentagon'
        'Sierpinski Pentagon 2'
        'Square'
        'Square 2'};
     
    fo = fa{n};
     
    switch fo
     
        case 'Sierpinski carpet'
     
            form.name = 'Sierpinski carpet';
            form.polyg = [0 .5 1 1 1 .5 0 0 ; 0 0 0 .5 1 1 1 .5];
            form.frac = 2/3;
            form.keeppolyg = false;
     
        case 'Sierpinski triangle'
     
            form.name = 'Sierpinski triangle';
            form.polyg = [0 1 .5 ; 0 0 sqrt(2)/2];
            form.frac = .5;
            form.keeppolyg = true;
     
        case 'Sierpinski Hexagon'
            form.name = 'Sierpinski Hexagon';
            t = linspace(0,2*pi,7);
            form.polyg = [sin(t(2:end)); cos(t(2:end))];
            form.frac = 2/3;
            form.keeppolyg = false;
     
        case 'Sierpinski Pentagon'
            form.name = 'Sierpinski Pentagon';
            t = linspace(0,2*pi,6);
            form.polyg = [sin(t(2:end)); cos(t(2:end))];
            form.frac = 2/3;
            form.keeppolyg = false;
     
        case 'Sierpinski Pentagon 2'
            form.name = 'Sierpinski Pentagon 2';
            t = linspace(0,2*pi,6);
            form.polyg = [sin(t(2:end)); cos(t(2:end))];
            form.frac = 5/8;
            form.keeppolyg = false;
     
        case 'Square'
            form.name = 'Square';
            form.polyg = [.5 1 .5 0 ; 0 .5 1 .5]*sqrt(2);
            form.frac = 3/4;
            form.keeppolyg = true;
     
        case 'Square 2'
            form.name = 'Square 2';
            form.polyg = [.5 1 .5 0 ; 0 .5 1 .5]*sqrt(2);
            form.frac = 3/5;
            form.keeppolyg = true;
     
    end
    et le fichier démo :
    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
    function demochaosgame
    %DEMOCHAOSGAME
    %
    %
     
    % Author : Jerome Briot (Dut)
    % Contact : dutmatlab#yahoo#fr -or- briot#cict#fr
    % Profil : www.mathworks.com/matlabcentral/newsreader/author/94805
    %        : www.developpez.net/forums/u125006/dut/
    %
    % Version : 1.0 - 03 Sep 2009
    %
     
    % MATLAB : 7.6.0.324 (R2008a)
    % System : Linux 2.6.24-24-generic
    %
     
    form = selectchaosgameform(2);
     
    N = 100000;
     
    [x,y,c] = chaosgame(form,N);
     
    drawchaosgame(x,y,c);
    title(sprintf('%s (%d iterations',form.name,N))
    Voila... si vous avez des remarques, des questions ou des suggestions, n'hésitez pas

    Mais rappelez-vous que je ne suis pas un spécialiste dans ce domaine

    Note : Ne sachant pas si ces codes sont justes, je ne les ai pas optimisés (et donc pas commentés)
    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)

  2. #2
    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 : 53 166
    Points
    53 166
    Par défaut
    Quelques images...
    Images attachées Images attachées    
    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)

  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 : 53 166
    Points
    53 166
    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
    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 : 53 166
    Points
    53 166
    Par défaut
    Quelques formes en plus tiré du site Wolfram Mathworld

    Fonction SELECTCHAOSGAMEFORM mise à jour dans le premier message
    Images attachées Images attachées     
    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)

  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 : 53 166
    Points
    53 166
    Par défaut
    Voici la version 3D :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    function chaosgame3d(form,N)
    %CHAOSGAME3D
    %
    %
     
    % Author : Jerome Briot (Dut)
    % Contact : dutmatlab#yahoo#fr -or- briot#cict#fr
    % Profil : www.mathworks.com/matlabcentral/newsreader/author/94805
    %        : www.developpez.net/forums/u125006/dut/
    %
    % Version : 1.0 - 03 Sep 2009
    %
     
    % MATLAB : 7.6.0.324 (R2008a)
    % System : Linux 2.6.24-24-generic
    %
     
    if nargin==0
     
        form.name = 'Sierpinski tetrahedron';
        form.polyg = [0 1 .5 .5 ; 0 0 sqrt(3)/2 sqrt(3)/6 ; 0 0 0 sqrt(2/3)];
        form.frac = .5;
        form.keeppolyg = true;
     
        N = 100000;
     
    end
     
    xs = .5+rand/10;
    ys = .5+rand/10;
    zs = .5+rand/10;
     
    sp = size(form.polyg,2);
     
    idx = randperm(sp);
     
     
    x = zeros(1,N);
    y = zeros(1,N);
    z = zeros(1,N);
    c = zeros(1,N);
     
    if form.keeppolyg
        x(1:sp) = form.polyg(1,:);
        y(1:sp) = form.polyg(2,:);
        z(1:sp) = form.polyg(3,:);
        c(1:sp) = 1:sp;
        k = sp+1;
    else
        k = 1;
    end
     
    x(k) = form.frac*form.polyg(1,idx(1))+(1-form.frac)*xs;
    y(k) = form.frac*form.polyg(2,idx(1))+(1-form.frac)*ys;
    z(k) = form.frac*form.polyg(3,idx(1))+(1-form.frac)*zs;
    c(k) = idx(1);
     
    for n=k+1:N
        idx = randperm(sp);
        x(n) = form.frac*form.polyg(1,idx(1))+(1-form.frac)*x(n-1);
        y(n) = form.frac*form.polyg(2,idx(1))+(1-form.frac)*y(n-1);
        z(n) = form.frac*form.polyg(3,idx(1))+(1-form.frac)*z(n-1);
        c(n) = idx(1);
    end
     
    figure('color','w')
     
    mc = max(c);
     
    hold on
    cmap = hsv(mc);
    cmap = cmap(randperm(mc),:);
     
    for n = 1:mc
        idx = c==n;
        h(n) = plot3(x(idx),y(idx),z(idx),'k.');
        set(h(n),'color',cmap(n,:));
    end
    title(sprintf('%s (%d iterations)',form.name,N))
    view(3);
    xlabel('x');
    ylabel('y');
    zlabel('z');
    box on
    grid on
    axis equal on vis3d
    Rien de bien compliqué a priori puisqu'il suffit juste d'ajouter une dimension supplémentaire au problème (aucun soucis, qui l'eut cru )
    Images attachées Images attachées  
    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)

Discussions similaires

  1. [Projet en cours] Jeu Visual Novel - Otome Game
    Par Celine Mancellon dans le forum Projets
    Réponses: 2
    Dernier message: 15/05/2016, 20h00
  2. Chaos sous IE6
    Par rems033 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/07/2008, 08h26
  3. [ codeur C++ ] Averick-games, jeu FPS
    Par averick-games dans le forum Projets
    Réponses: 7
    Dernier message: 10/08/2007, 09h29

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