Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme Diamond Square

problème de mise en place JAVA

    19 juillet 2016 à 11:41:02

    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.
    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2016 à 12:40:58

      Bonjour,

      Etre capable d'implémenter un algorithme à partir de pseudocode est une des bases de la programmation. Tu peux soit attendre que quelqu'un te ponde une version "clé en main" (mais tu risques d'attendre longtemps), soit poster ici les problèmes que tu rencontres durant tes tentatives d'implémentations (plus précisément que "ça ne marche pas").

      Bonne chance et à bientôt peut-être.

      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2016 à 13:17:21

        http://www.bluh.org/code-the-diamond-square-algorithm/
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2016 à 14:56:36

          Merci les amis, pour vos réponses.

          Voici mon code :

                  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 ;
                  }

          Le résultat n'est clairement pas le bon.
          Merci a celui qui saura comprendre pourquoi et éventuellement proposer une solution.
           

          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2016 à 16:13:18

            Avez vous une idée d'où cela peut-il venir ?
            • Partager sur Facebook
            • Partager sur Twitter

            Algorithme Diamond Square

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown