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 :

Empêcher 2 points juxtaposés [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut Empêcher 2 points juxtaposés
    Bonjour,

    Je fais un script qui permet d'empêcher que 2 points aléatoires ne se trouvent aux mêmes coordonnées.

    Ce code devrait donc placer 9 points bien alignés qui remplissent une surface de 3 fois 3 avec un plot.

    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
     
    N = 9;
     
    x = round(1 + (3-1) .* rand(N,1));
    y = round(1 + (3-1) .* rand(N,1));
     
    for j = 1:N
        for i = 1:N
     
        if i == j
            continue
     
        else
            while  x(j) == x(i) && y(j) == y(i)
                    x(j) = round(1 + (3-1) * rand(1));
                    y(j) = round(1 + (3-1) * rand(1));
            end
     
        end
     
        end
    end
    Mais comme vous vous en doutez, ça ne marche pas.

    Si vous pouviez m'aider, merci !

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    je crois deja que tu t'es peut être emmelé un peu dans tes indices i et j.

    Ensuite, le problème est que au fur et à mesure que tu avances tu ne prends plus en compte les lignes précédemment validées, par exemple : si tu trouves que la ligne 4 est identique à la ligne 3, tu retires la ligne 4 jusqu'a ce qu'elle soit différente de la ligne 3 mais tu ne vas pas tester si cette nouvelle ligne 4 est différente de la ligne 2.

    une solution :
    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
     
    clear all
    close all
    clc
    tic
    N = 9;
     
    x = round(1 + (3-1) .* rand(N,1));
    y = round(1 + (3-1) .* rand(N,1));
     
    XY = [x,y];
    ligne = 2;
    while ligne<=N
        ligne_verifiee = 0;
        for i = 1 :ligne-1
            if any(XY(ligne,:) ~= XY(i,:))
                ligne_verifiee = ligne_verifiee + 1;
            end
        end
        if ligne_verifiee == ligne-1
            ligne = ligne+1;
        else
            XY(ligne,:) = round(1 + (3-1) * rand(1,2));
        end
    end
    toc
    il y a probablement plus élégant, mais ca marche

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    ou sinon, beaucoup plus simplement, avec la fonction randperm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x = [1;1;1;2;2;2;3;3;3];
    y = [1;2;3;1;2;3;1;2;3];
    ind = randperm(9);
    x = x(ind);
    y = y(ind);

  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 883
    Points
    52 883
    Par défaut
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ind = randperm(9);
     
    [x,y] = ind2sub([3 3],ind);
    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
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    Merci, mais le problème avec les deux codes que vous me proposez, c'est que si l'écart n'est pas de 3, mais prenons de 10, cela donnera quelque chose comme ça en résultat :

    x = [1,4,7,9,6,8,3,5,2]

    y = [1,1,1,1,1,1,1,1,1]

    Alors premièrement, cela empêche d'avoir deux fois la même position en x ce qui n'est absolument pas un problème et que je ne veux donc pas empêcher.
    Et deuxièmement, la coordonnée de y est toujours de 1.
    Peut-on y remédier facilement ?

  7. #7
    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 883
    Points
    52 883
    Par défaut
    La solution que j'ai donnée fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    N = 10;
     
    ind = randperm(N*N);
     
    [x,y] = ind2sub([N N],ind);
    Ou alors je n'ai pas bien compris ton problème...
    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)

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    En fait mon but n'est pas de construire un joli bloc de N*N, j'ai juste donné cet exemple afin que l'on comprenne bien ce que mon script devrait faire si N valait 9 et le maximum du Random valait 3.
    Ce n'est surement pas clair.
    Ce que je fais précisément, c'est une simulation de colonisation spatiale, N étant le nombre de système à coloniser. Mon script doit simplement servir à empêcher que deux systèmes ne se trouvent aux mêmes coordonnées.
    D'ailleurs celui de Dombrai fonctionne parfaitement, même si compliqué.

  9. #9
    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 883
    Points
    52 883
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    N = 9;
    ecart = 10;
     
    ind = randperm(ecart*ecart);
     
    [x,y] = ind2sub([ecart ecart],ind(1:N));
    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)

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 50
    Points : 27
    Points
    27
    Par défaut
    C'est nickel merci !

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

Discussions similaires

  1. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  2. TChart : déplacer un point
    Par Nicolas dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/11/2002, 18h05
  3. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51
  4. Réponses: 3
    Dernier message: 12/06/2002, 19h03
  5. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 23/05/2002, 18h14

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