0

ハイトマップを使用して地形生成の実験を行っており、単純な値のノイズを書きました。コードに何も表示されませんが、自分の愚かさまたは浮動小数点エラーが発生していること以外は何も表示されません。

#include 
#include <stdlib.h>
#include <math.h>

long jenkins( long a ){
    a = (a+0x7ed55d16) + (a>19);
    a = (a+0x165667b1) + (a>16);
    return a;
}

float random(long x, long y, long seed1, long seed2, long seed3){
    long state = jenkins( x ) - jenkins(y);
    state = jenkins(state - seed1);
    state -= jenkins(state ^ seed2);
    state -= jenkins(state - seed2);
    state ^= (x*y) - jenkins( (seed1-seed2) ^ seed3 );
    float ret = ((float)(state&0xFFFF))/65535.0f;
    return ret;
}

float valueNoise( float x, float y, long seed1, long seed2, long seed3 ){
    float fx = x-floor(x);
    float fy = y-floor(y);

    long flx = (long) x-fx;
    long fly = (long) y-fy;

    fx = fx*fx*(3 - 2*fx);
    fy = fy*fy*(3 - 2*fy);



    float r00 = random(flx,fly,seed1,seed2,seed3);
    float r10 = random(flx+1,fly,seed1,seed2,seed3);
    float r01 = random(flx,fly+1,seed1,seed2,seed3);
    float r11 = random(flx+1,fly+1,seed1,seed2,seed3);

    float i0 = (1-fx)*r00 + fx*r10;
    float i1 = (1-fx)*r01 + fx*r11;

    return ( (1-fy)*i0 + fy*i1 );
}

void writeOutPGM(char *filename, unsigned char *data){
    FILE *file = fopen(filename,"w");
    char header[] = "P5 512 512 255\n";
    fwrite(header,sizeof(header),1,file);
    fwrite(data,262144,1,file);
}

extern float valueNoise( float x, float y, long seed1, long seed2, long seed3 );

int main(){
    unsigned char *data = malloc(512*512);
    float fx,fy;
    int x,y;
    long s1 = 123,s2 = 456,s3 = 789;
    for( y = 0; y < 512; ++y ){
        for( x = 0; x < 512; ++x ){
            fx = floor( ((float)x)/10.0f );
            fy = floor( ((float)y)/10.0f );

            data[x + y*512] = (unsigned char) 255.0f*valueNoise(fx,fy,s1,s2,s3);
        }
    }

    writeOutPGM("noise.pgm",data);
}

線をより明確に表示するために floor() を入れました。

x/y を除算しないと良いノイズが出力されます。それは除算か私の補間のどちらかだと思います。しかし、私は何が起こっているのか本当に無知です。

助けてくれてありがとう、Erkling

4

1 に答える 1

0

エラーはノイズによるものではなく、PGM 書き込みコードによるものでした。ファイルは Windows でテキストモードで開かれ、すべての UNIX 改行が一度 Windows に変換されたため、奇妙な不具合が発生しました。

于 2013-01-29T15:00:56.460 に答える