2017-05-22 14 views
1

私は現在私のフリータイムで働いているものに少し問題があります: 私はC++でDSA経由で高さマップを作成したかったのです。しかし、私は計画どおりには機能しません。 私のコードは、(2件の文字のコメントを無視してください)です。ダイヤモンドスクエアアルゴリズムが斜線カットを作成

void DiamondSquareAlgorithm(int x1, int y1, int x2, int y2, float range, unsigned level) 
{ 
    //level = size - 1 when called the first time 

    if (level < 1) return; 
    float a; 
    float b; 
    float c; 
    float d; 
    float e; 
    for (int i = x1; i < x2; i += level) 
    { 
     for (int j = y1; j < y2; j += level) 
     { 
      //diamond 
      a = startArr[i + j * (x2 - x1 + 1)]; //lo 
      b = startArr[(i + level) + j * (x2 - x1 + 1)]; //ro 
      c = startArr[i + (j + level) * (x2 - x1 + 1)]; //lu 
      d = startArr[(i + level) + (j + level) * (x2 - x1 + 1)]; //ru 
      e = startArr[(i + level/2) + (j + level/2) * (x2 - x1 + 1)] = (a + b + c + d)/4; 
     } 
    } 

    for (int i = x1; i < x2; i += level) 
    { 
     for (int j = y1; j < y2; j += level) 
     { 
      a = startArr[i + j * (x2 - x1 + 1)]; //lo 
      b = startArr[(i + level) + j * (x2 - x1 + 1)]; //ro 
      c = startArr[i + (j + level) * (x2 - x1 + 1)]; //lu 
      d = startArr[(i + level) + (j + level) * (x2 - x1 + 1)]; //ru 
      e = startArr[(i + level/2) + (j + level/2) * (x2 - x1 + 1)] = (a + b + c + d)/4; 

      //square 
      startArr[(i + level/2) + j * (x2 - x1 + 1)] = (a + b + e)/3; //o 
      startArr[(i + level) + (j + level/2) * (x2 - x1 + 1)] = (b + d + e)/3; //r 
      startArr[(i + level/2) + (j + level) * (x2 - x1 + 1)] = (d + c + e)/3; //u 
      startArr[i + (j + level/2) * (x2 - x1 + 1)] = (a + c + e)/3; //l 
     } 
    } 
    DiamondSquareAlgorithm(x1, y1, x2, y2, range/2, (level/2)); 
}; 

結果は常にこの線に沿って何かである:

Terrain

誰かは明らかに重大な間違いを見つける私を助けてください私は自分のコードを作った?

+0

問題の原因がわかりません。コード全体を追加しようとする必要があります。わからないことは、 'startArr'(calc上のオフセット)のサイズとパラメータまたは出力です。あなたはコードを追加することができます:http://ideone.com/? – xsami

+2

11行目から22行目までのコードブロックには何も関係しません。「a、b、c、d、e」に値を代入する – xsami

+0

コードの最後にセミコロンが付いていませんか? (コンパイルしないでください) – xsami

答えて

0

私のコードで問題が見つかりました。上記のもののほとんどは1つの小さなことを除いて正しいです:それは(x2 - x1 + 1)であってはなりません。これは、配列内のすべての値を1つのスペースにさらに移動します。これはすべてのステップで発生し、この対角線が表示されます。正しく動作するコードは

void DiamondSquareAlgorithm(int x1, int y1, int x2, int y2, float range, unsigned level) 
{ 
    //level = size - 1 when called the first time 
    if (level <= 1) return; 
    float a; 
    float b; 
    float c; 
    float d; 
    float e; 
    int width = x2 - x1; 
    for (int y = x1; y < x2; y += level) 
    { 
     for (int x = y1; x < y2; x += level) 
     { 
      //diamond 
      a = startArr[x + y * width]; //lo 
      b = startArr[(x + level) + y * width]; //ro 
      c = startArr[x + (y + level) * width]; //lu 
      d = startArr[(x + level) + (y + level) * width]; //ru 
      e = startArr[(x + level/2) + (y + level/2) * width] = Fit(((a + b + c + d)/4) + Random(-1, 1) * range); 
     } 
    } 
    for (int y = x1; y < x2; y += level) 
    { 
     for (int x = y1; x < y2; x += level) 
     { 
      a = startArr[x + y * width]; //lo 
      b = startArr[(x + level) + y * width]; //ro 
      c = startArr[x + (y + level) * width]; //lu 
      d = startArr[(x + level) + (y + level) * width]; //ru 
      e = startArr[(x + level/2) + (y + level/2) * width]; 

      //square 
      startArr[(x + level/2) + y * width] = Fit(((a + b + e)/3) + Random(-0.5, 0.5) * range); //o 
      startArr[(x + level) + (y + level/2) * width] = Fit(((b + d + e)/3) + Random(-0.5, 0.5) * range); //r 
      startArr[(x + level/2) + (y + level) * width] = Fit(((d + c + e)/3) + Random(-0.5, 0.5) * range); //u 
      startArr[x + (y + level/2) * width] = Fit(((a + c + e)/3) + Random(-0.5, 0.5) * range); //l 
     } 
    } 
    DiamondSquareAlgorithm(x1, y1, x2, y2, range/2, (level/2)); 
}; 

float Fit(float x)あるので、値がない1より大きく、0よりない値も小さいフロートをとり、0と1と比較する方法です。 float Random(float a, float b)は、2つのフロートの間にランダムな浮動小数点を与えます。 heightfield

+0

エラーを見つけたのは良いことですが、ここではコミュニティが見つけにくいです。 'x2'と' y2'のパラメータは、それにもかかわらず何があったのでしょうか? (後見では、対角線からは明らかですが、それでもなおです)。 –

関連する問題