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

Java Discussion :

Algorithme Diamond Square


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut Algorithme Diamond Square
    Bonjour.

    J'essaye en vain de reproduire l'algorithme Diamond Square.
    En recherchant à droite a gauche je vois différents algorithme proposés en pseudo-code mais jamais véritablement en Java semble-t-il.
    J'ai essayé de les adapter, mais sans succès. Le résultat est le plus souvent une forme de noise...

    SVP, connaissez vous, ou pouvez vous faire une version propre et définitive en JAVA de cet algorithme Diamond Square ?
    Bien qu'il est censé être simple, j'ai du mal a comprendre comment il fonctionne.

    Merci beaucoup si vous pouvez m'aider dans cette étape fondamentale.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par mazertys17 Voir le message
    J'essaye en vain de reproduire l'algorithme Diamond Square.
    En recherchant à droite a gauche je vois différents algorithme proposés en pseudo-code mais jamais véritablement en Java semble-t-il.
    C'est un peu normal : un algorithme est la description d'un process, indépendemment du langage d'implémentation. Si tu veux un code Java, il faut soit encoder l'algorithme en Java, soit chercher un code Java ("code java diamond square" donne pas mal de réponses).

    Citation Envoyé par mazertys17 Voir le message
    J'ai essayé de les adapter, mais sans succès. Le résultat est le plus souvent une forme de noise...
    Si tu nous montrais justement ce que tu as fait, on pourrait te dire ce qui ne va pas. La base de l'algorithme est un système fractale : on prend la moyenne entre x points (seuls 4 coins au départ sont aléatoires, et une légère variation aléatoire dans le reste). Si tu obtiens une sorte de noise, c'est que probablement tu utilises de l'aléatoire ailleurs (ou que la variation aléatoire est trop importante) que dans la phase initiale.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Salut,

    Implémenter un pseudo-code - qui fonctionne - c'est simple et ne requiert pas une grande intelligence, comprendre le fonctionnement de cet algorithme est tout autre chose, lis le texte et analyse le schéma : https://fr.wikipedia.org/wiki/Algori...Fonctionnement
    Si tu connais Java tu n'auras aucune difficulté à créer ta propre implémentation, si tu ne connais pas Java, ne commence pas forcément par l'implémentation de cet algorithme
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Merci pour vos réponses.

    J'ai pourtant du mal a le faire fonctionner correctement :

    voici mon code :

    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
    int hightness = 255 ;
    int level[][] = new int[sizeX][sizeX] ;
     
    for ( int xx = 0 ; xx < sizeX ; xx ++ ){
        for ( int yy = 0 ; yy < sizeX ; yy ++ ){
            level[xx][yy] = (int) (0);
        }
    }
    level[0][0] = 100 ;
    level[sizeX-1][0] = 100 ;
    level[sizeX-1][sizeX-1] = 100 ;
    level[0][sizeX-1] = 100 ;
     
    int s = sizeX;
    while ( s > 1 ){
        int half = s/2 ;
        hightness = hightness/2 ;
     
        for ( int xx = half ; xx < sizeX ; xx += s ){
            for ( int yy = half ; yy < sizeX; yy += s ){
                int moyenne = level[xx-half][yy-half] + level[xx+half][yy-half] + level[xx+half][yy+half] + level[xx-half][yy+half] ;
                level[xx][yy] = moyenne / 4 +  (int)(((rand.nextFloat()*2-1) * (float)hightness) ) ;
            }
        }
        int modulor = 1;
        for (int xx = 0; xx < sizeX; xx += half) {
            for (int yy = modulor * half; yy < sizeX; yy += s) {
                int moyenne = 255 / 2;
                int divisor = 1;
                if (xx >= 0 && xx < sizeX && yy - half >= 0 && yy - half < sizeX) {
                    moyenne += level[xx][yy - half];
                    divisor++;
                }
                if (xx + half >= 0 && xx + half < sizeX && yy >= 0 && yy < sizeX) {
                    moyenne += level[xx + half][yy];
                    divisor++;
                }
                if (xx >= 0 && xx < sizeX && yy + half >= 0 && yy + half < sizeX) {
                    moyenne += level[xx][yy + half];
                    divisor++;
                }
                if (xx - half >= 0 && xx - half < sizeX && yy >= 0 && yy < sizeX) {
                    moyenne += level[xx - half][yy];
                    divisor++;
                }
                if (xx >= 0 && xx < sizeX && yy + s / 2 >= 0 && yy + s / 2 < sizeX) {
                    moyenne = moyenne / divisor;
                    moyenne = moyenne + (int)(((rand.nextFloat()*2-1) * (float)hightness) ) ;
                    if (moyenne < 0) {
                        moyenne = 0;
                    } else if (moyenne > 255) {
                        moyenne = 255;
                    }
                    level[xx][yy] = moyenne ;
                }
            }
            if (modulor == 1) {
                modulor = 0;
            } else if (modulor == 0) {
                modulor = 1;
            }
        }
        s = half ;
    }

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je n'ai pas regardé dans le détail ton algorithme parce qu'il y a quelque qui saute aux yeux : moyenne et divisor sont des int. En Java, un int divisé par int donne un int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
     
       System.out.println(1/3 + " != " + 1f/3);
       System.out.println(3/2 + " != " + 3f/2);
       System.out.println(255/7 + " != " + 255f/7);
     
    }
    Donne

    0 != 0.33333334
    1 != 1.5
    36 != 36.42857
    
    Peut-être un premier problème à régler.

    Ensuite, il y a de nombreuses petites différences avec l'algorithme. Si certaines ne sont pas impactantes (comme le fait d'initialiser à 100 les 4 coins au lieu de mettre une valeur aléatoire), d'autres me semblent plus douteuses au premier abord (l'initialisation de moyenne à 255/2 et divisor à 1, par exemple, ou ton modulor qui n'a rien à voir avec le decalage indiqué dans l'algorithme).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Si j'ai utilisé 255/2, c'est pour initialiser a la moyenne au cas où, dans la phase Diamond en particulier, il ne trouve pas de points ( les diamans hors du cadre étants inexistants ).

    Mon but est de générer des Ints entre 0 et 255 pour faire une image en noir et blanc pour commencer.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La moyenne de 100, 150, 200 vaut 150. Dans ton cas, 144. Celle de 255, 255, 255 vaut 255, dans ton cas 223. Celle de 0, 0, 0 vaut 0, dans ton cas 31.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Certes, mais qu'est ce que cela change ?
    Il s'agit de la valeur contenu et non de la case en elle même, ou taille du tableau.

    il s'agit d'une valeur pour la couleur. cela ne change pas grand chose du résultat l'arrondie.
    Est-ce problématique pour le "pseudo-aléatoire" ?

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu disais que ton résultat ressemblait à du bruit. Avec Perlin : tu pars d'un bruit et tu appliques une turbulence : avec une turbulence trop faible, on a peu de différences avec le bruit d'origine. Tant que les valeurs calculées ne sont pas celles qu'on devrait calculer, décrite par l'algorithme, faut pas chercher ailleurs. Ensuite, quand ça fonctionne, on peut jouer avec l'algorithme.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Je parle de l'algorithme Diamond Square et non l'Algorithme de Perlin.
    Est-ce le même algorithme ?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, ce ne sont pas les mêmes algorithmes et n'ont pas les mêmes propriétés (le résultat n'a pas les mêmes propriétés, l'un étant fractal et l'autre non, forcément). Je donnais juste en exemple un autre algo pour lequel une simple variation sur l'algo peut afficher du bruit au lieu du résultat attendu.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    ok.

    Pour ma part, je n'ai pas besoin de fractal nécessairement. Un simple algorithme Diamond Square suffira donc amplement.
    Mon but étant de générer une map avec un relief afin de faire, notamment, des îles.

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Diamond Square est fractal ! (le fait de subdiviser récursivement et de calculer la valeur médiane par rapport aux bords, c'est fractal).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    ah ok.
    Quoi qu'il en soit, Diamond Square me paraît beaucoup plus simple que Perlin sauf erreur...

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Mais je ne t'ai jamais dit d'utiliser Perlin Cela dit, ça n'a rien de complexe (y compris comparé au DS). Mais de toute manière ça ne te servira pas à générer des paysages du type de ceux créer par le DS.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    non je disais que le résultat ressemblait à une sorte de bruit, mais ce en utilisant mon code ci-dessus, basé sur le conept du Diamond Square.

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, j'ai bien compris. C'est pourquoi je te disais que selon la turbulence appliquée au noise pour faire du Perlin, on pouvait avoir quelque chose qui ressemblait à du noise, et donc, qu'avec des approximations comme faites dans ton code, ça ne m'étonnait pas qu'on puisse avoir le même effet sur du Diamond Square.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Ok, je comprends.

    En revanche je ne vois pas de quels "approximations" tu parles ?

    J'avais déjà essayé en utilisant un float à la place du int, mais le résultat était le même sauf erreur.
    Je vais néanmoins tester mais il semblerait que ce ne soit pas la source du problème.

  19. #19
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Je confirme, que cela ne change rien...

  20. #20
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    J'ai testé ton implémentation : elle ne génère pas du tout du bruit, mais plutôt un paysage hyper plat, avec quelques effets ressemblant à du dithering, ou je ne sais pas comment ça s'appelle au juste. C'est dû au fait que tu bornes les altitudes dans un intervalle [0,255[ pendant le calcul, et que tu initialises la moyenne à 255/2. Il faut calculer les altitudes entre un min et max, oui, mais pas pendant le calcul, parce que chaque nouveau point sert de référence à d'autres points. Il faut pratiquer une normalisation à la fin du traitement pour que l'intervalle [min,max[ d'altitudes puissent être traduit dans un intervalle [0,255[.

    Voici ton code (et l'implémentation de l'algo indiqué sur wikipedia), avec la correction :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    public class DiamondSquare {
     
    	public static void main(String[] args) {
     
    		int n=128;
    		int s=2*n+1;
     
    		int h = 1000;
     
    		int[][] tab = _gen(s,h);
     
    		BufferedImage image = new BufferedImage(s, s, BufferedImage.TYPE_INT_RGB);
     
    		Color[] palette = createPalette();
    		for(int i=0; i<tab.length; i++) {
    			for(int j=0; j<tab[i].length; j++) { 
    				final int comp = Math.max(0,Math.min((int)(((tab[i][j]+h/2d)/h)*255),255)); 
    				final Color color = palette[comp];
    				image.setRGB(i, j, color.getRGB());
    			}
    		}
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(new JLabel(new ImageIcon(image)));
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static Color[] createPalette() {
    		Map<Color,Color> colors = new HashMap<>();
    		Color[] palette = new Color[256];
    		for(int i=0; i<256; i++) {
    			//palette[i]= new Color(i,i,i); // niveaux de gris
    			if ( i>250 ) {
    				palette[i] = colors.computeIfAbsent(Color.WHITE, c->c);
    			}
    			else if ( i>225 ) {
    				palette[i] = colors.computeIfAbsent(Color.GRAY, c->c);
    			}
    			else if ( i>200 ) {
    				palette[i] = colors.computeIfAbsent(Color.GREEN.darker().darker(), c->c);
    			}
    			else if ( i>175 ) {
    				palette[i] = colors.computeIfAbsent(Color.GREEN.darker(), c->c);
    			}
    			else if ( i>155 ) {
    				palette[i] = colors.computeIfAbsent(Color.GREEN, c->c);
    			}
    			else if ( i>105 ) {
    				palette[i] = colors.computeIfAbsent(Color.YELLOW.darker(), c->c);
    			}
    			else if ( i>95 ) {
    				palette[i] = colors.computeIfAbsent(Color.ORANGE, c->c);
    			}
    			else if ( i>85 ) {
    				palette[i] = colors.computeIfAbsent(new Color(106,223,230), c->c);
    			}
    			else if ( i>70 ) {
    				palette[i] = colors.computeIfAbsent(new Color(43,120,206), c->c);
    			}
    			else {
    				palette[i] = colors.computeIfAbsent(new Color(52,63,197), c->c);
    			}
    		}
    		return palette;
    	}
     
    	/** implémentation algo wikipedia */
    	public static int[][] gen(int s, int h) {
    		int[][] t = new int[s][s];
    	    int h2 = h/2;
    	    int i = s - 1;
    			    t[0][0] = (int)rand(-h2,h2);
    			    t[0][i] = (int)rand(-h2, h2);
    			    t[i][i] = (int)rand(-h2, h2);
    			    t[i][0] = (int)rand(-h2, h2);
    			    while (i > 1) {
    			        int id = i/2;
    			        for(int x = id; x<s; x+=i) {
    			            for(int y = id; y<s; y+=i) {
    			            	if ( x-id>=0 && y-id>=0 && x+id<s && y+id<s ) {
    				                double moyenne = ( t[x - id][y - id] + t[x - id][y + id] + t[x + id][y + id] + t[x + id][ y - id] ) / 4d;
    				                t[x][y] = (int)(moyenne + rand(-h2, h2));    
    			            	}
    			            }
    			        }
    			        for(int x=0; x<s ; x+=id) {
    				        int decalage;
    			            if ( x % i == 0 ) { 
    			                decalage = id;
    			            } else {
    			                decalage = 0;
    			            }
    			            for( int y=decalage; y<s; y+=i ) {
    			                double somme = 0;
    			                int n = 0;
    			                if (x >= id) {
    			                    somme += t[x - id][y];
    			                    n++;
    			                }
    			                if (x + id < s) {
    			                    somme += t[x + id][y];
    			                    n++;
    			                }
    			                if (y >= id) {
    			                    somme += t[x][y - id];
    			                    n++;
    			                }
    			                if (y + id < s) {
    			                    somme += t[x][y + id];
    			                    n++;
    			                }
    			                t[x][y] = (int)(somme / n + rand(-h2, h2));
    			            }
    			        }
    			        i = id;
     
    			        h2 = h2/2;
    			    }
    			    return t;
    	}
     
    	private static double rand(int min, int max) {
    		if ( min<max ) {
    		double rand=ThreadLocalRandom.current().nextDouble(min, max); 
    		return rand;
    		}
    		else {
    			return 0;
    		}
    	}
     
    	/* ton implémentation corrigée */
    	public static int[][] _gen(int sizeX, int hightness) {
     
    		Random rand = new Random();
     
    		int level[][] = new int[sizeX][sizeX] ;
     
    		/* inutile : un tableau est rempli de à à l'initialisation
    		  for ( int xx = 0 ; xx < sizeX ; xx ++ ){
     
    		    for ( int yy = 0 ; yy < sizeX ; yy ++ ){
    		        level[xx][yy] = (int) (0);
    		    }
    		}*/
     
     
    		// ici : initialiser ces valeurs aléatoirement (ou faire une première passage sur un maillage plus fin pour initialiser une forme de paysage contrainte)
    		level[0][0] = 100 ;
    		level[sizeX-1][0] = 100 ;
    		level[sizeX-1][sizeX-1] = 100 ;
    		level[0][sizeX-1] = 100 ;
     
    		int s = sizeX; 
    		while ( s > 1 ){
    		    int half = s/2 ;
    		    hightness = hightness/2 ;
     
    		    for ( int xx = half ; xx < sizeX ; xx += s ){
    		        for ( int yy = half ; yy < sizeX; yy += s ){ 
    		            int moyenne = level[xx-half][yy-half] + level[xx+half][yy-half] +  level[xx+half][yy+half] + level[xx-half][yy+half] ;
    		            level[xx][yy] = moyenne / 4 +  (int)(((rand.nextFloat()*2-1) * (float)hightness) ) ;
    		        }
    		    }
    		    int modulor = 1;
    		    for (int xx = 0; xx < sizeX; xx += half) {
    		        for (int yy = modulor * half; yy < sizeX; yy += s) {
    		            /*int moyenne = 255 / 2;
    		            int divisor = 1;*/
    		            int moyenne = 0;
    		            int divisor = 0;
    		            if (xx >= 0 && xx < sizeX && yy - half >= 0 && yy - half < sizeX) {
    		                moyenne += level[xx][yy - half];
    		                divisor++;
    		            }
    		            if (xx + half >= 0 && xx + half < sizeX && yy >= 0 && yy < sizeX) {
    		                moyenne += level[xx + half][yy];
    		                divisor++;
    		            }
    		            if (xx >= 0 && xx < sizeX && yy + half >= 0 && yy + half < sizeX) {
    		                moyenne += level[xx][yy + half];
    		                divisor++;
    		            }
    		            if (xx - half >= 0 && xx - half < sizeX && yy >= 0 && yy < sizeX) {
    		                moyenne += level[xx - half][yy];
    		                divisor++;
    		            }
    		            if (xx >= 0 && xx < sizeX && yy + s / 2 >= 0 && yy + s / 2 < sizeX) {
    		                moyenne = moyenne / divisor;
    		                moyenne = moyenne + (int)(((rand.nextFloat()*2-1) * (float)hightness) ) ;
    		                /*if (moyenne < 0) {
    		                    moyenne = 0;
    		                } else if (moyenne > 255) {
    		                    moyenne = 255;
    		                }*/
    		                level[xx][yy] = moyenne ;
    		            }
    		        }
    		        if (modulor == 1) {
    		            modulor = 0;
    		        } else if (modulor == 0) {
    		            modulor = 1;
    		        }
    		    }
    		    s = half ;
    		}
     
    		return level;
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Algorithme Diamond Square
    Par mazertys17 dans le forum Général Java
    Réponses: 0
    Dernier message: 09/07/2016, 15h57
  2. Diamond - Square
    Par univscien dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 04/08/2009, 16h54
  3. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

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