2010-09-11 54 views
0

我试图实现Diamond-square algorithm,但问题是只有一部分位图正在填充,我不知道有什么问题。我递归这样做:帮助与钻石广场算法实施

GLuint CreateDsquare() 
    { 
     std::vector<GLubyte> pdata(256 * 256 * 4); 


     vector2i loc; 
     vector2i sz; 
     GLubyte val; 

     sz.x = 256; 
     sz.y = 256; 

     val = rand() % 255; 

     loc = vector2i(0,0); 

     pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 

     loc.x = sz.x - 1; 
     loc.y = 0; 

     val = rand() % 255; 

     pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 

     loc.x = sz.x - 1; 
     loc.y = sz.y - 1; 

     val = rand() % 255; 

     pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 

     loc.x = 0; 
     loc.y = sz.y - 1; 

     val = rand() % 255; 

     pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
     pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 

     RescursiveDiamond(pdata,sz,vector2i(0,0)); 

     return CreateTexture(pdata,256,256); 
    } 

void RescursiveDiamond(std::vector<GLubyte> &pdata,vector2i psz, vector2i offset) 
{ 
    int val; 
    int newnum; 
    if(psz.x < 2 && psz.y < 2) 
    { 
     return; 
    } 


    vector2i loc; 
    vector2i sz = psz; 

    std::vector<int> pvertz(4,0); 

    loc = offset; 
    pvertz[0] = pdata[loc.y * 4 * sz.x + loc.x * 4 + 0]; 

    loc.x = offset.x + (psz.x - 1); 
    loc.y = offset.y; 
    pvertz[1] = pdata[loc.y * 4 * sz.x + loc.x * 4 + 0]; 

    loc.x = offset.x + (psz.x - 1); 
    loc.y = offset.y + (psz.y - 1); 
    pvertz[2] = pdata[loc.y * 4 * sz.x + loc.x * 4 + 0]; 

    loc.x = offset.x; 
    loc.y = offset.y + (psz.y - 1); 
    pvertz[3] = pdata[loc.y * 4 * sz.x + loc.x * 4 + 0]; 


    val = (pvertz[0] + pvertz[1])/2; 
    val += 255; 
    loc.x = (offset.x + (sz.x - 1))/2; 
    loc.y = offset.y; 

    pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 


    val = (pvertz[1] + pvertz[2])/2; 
    val += 255; 
    loc.x = (offset.x + (sz.x)) - 1; 
    loc.y = ((offset.y + (sz.y))/2) - 1; 

    pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 


    val = (pvertz[3] + pvertz[2])/2; 
    val += 255; 
    loc.x = ((offset.x + (sz.x))/2) - 1; 
    loc.y = (offset.y + (sz.y)) - 1 ; 

    pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 


    val = (pvertz[0] + pvertz[3])/2; 
    val += 255; 
    loc.x = offset.x; 
    loc.y = (offset.y + (sz.y)) - 1 ; 

    pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 

    //center 

    val = (pdata[(offset.y) * 4 * sz.x + ((offset.x + (sz.x - 1))/2) * 4 + 0] + 
     pdata[(offset.y + (sz.y - 1)) * 4 * sz.x + ((offset.x + (sz.x - 1))/2) * 4 + 0])/2; 

    int ad = (rand() % 12) - 6; 
    if(val + ad < 0) 
    { 
     val = 0; 
    } 
    else 
    { 
     val += ad; 
    } 

    val += 255; 

    loc.x = ((offset.x + (sz.x))/2) - 1; 
    loc.y = ((offset.y + (sz.y))/2) - 1; 

    pdata[loc.y * 4 * sz.x + loc.x * 4 + 0] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 1] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 2] = val; 
    pdata[loc.y * 4 * sz.x + loc.x * 4 + 3] = 255; 



    vector2i newoffset; 
    vector2i newparentsz; 

    newoffset = offset; 
    newparentsz = (psz/2); 

    RescursiveDiamond(pdata,newparentsz,newoffset); 

    newoffset.x = offset.x + (newparentsz.x); 
    newoffset.y = offset.y; 

    RescursiveDiamond(pdata,newparentsz,newoffset); 


    newoffset.x = offset.x; 
    newoffset.y = offset.y + (newparentsz.y); 

    RescursiveDiamond(pdata,newparentsz,newoffset); 
    newoffset.x = offset.x + (newparentsz.x); 
    newoffset.y = offset.y + (newparentsz.y); 

    RescursiveDiamond(pdata,newparentsz,newoffset); 



} 

我怀疑,我可能会回想起了错误的偏移或东西的功能。

偏移就像是左上角,然后是尺寸,这些都是正方形。

这里有什么可能是错的?

感谢

+0

有一个问题(我只是滚动代码来阅读完整的文章):为什么'255'有时和'val'大多数其他时间呢? – pmg 2010-09-11 21:14:38

+0

@pmg我得到了零,所以这主要是为了测试,但id atleast期望所有像素都包含某些东西,但大多数都是空的,如果在递归之前将偏移量乘以2,则屏幕的一半被完全填满,另一半只有第一次迭代,这就是为什么我怀疑它在递归部分。 – jmasterx 2010-09-11 21:17:33

+0

有什么不对?你没有解释你正在努力完成什么,而你的代码是非常多余的,因此很难阅读。它使用'val'这样的名字,我相信这可能是'luminosity'的简写形式,你的alpha值为255,因为裸数已经使一个评论者感到困惑,等等。 – msw 2010-09-11 21:19:41

回答

0

当您计算到您的身高地图对于每行(y * pitch),您正在使用当前正在计算的平方的大小,而不是实际的256点。您进入递归的深度越深,您就会写入高度图,就好像它越来越小直到递归的最后一步写入像素(0,0)。

1

好吧,首先,让我们开始清理违规D-R-Y,你的代码应该沿着这个线路更多:

int position(_y, _x, _offset){ 
    return _y * _x * 4 + _x * 4 + _offset; 
} 

void adjust(vector<GLubyte> &pdata, _x, _y){ 
    GLubyte val = rand() % 255; 
    for(int j=0; j < 3; ++j){ 
     pdata[ position(_y, _x, j) ] = val; 
    } 
    pdata[ position(_y, _x, 3) ] = 255; 
} 

GLuint CreateDsquare(){ 
    vector2i sz; 

    sz.x = 256; 
    sz.y = 256; 

    adjust(pdata, 0, 0); 
    adjust(pdata, sz.x - 1, 0); 
    adjust(pdata, sz.x -1, sz.y - 1); 
    adjust(pdata, 0, sz.y - 1); 

    RescursiveDiamond(pdata,sz,vector2i(0,0)); 

    return CreateTexture(pdata,256,256); 
} 

可以格式化它的休息下来,它更具可读性/可理解性?然后,我会更新,以便我可以更好地回答您的问题(如果有人没有打我,或者女人决定我有足够的电脑时间)。

+4

研究表明,称她“女人”增加她会决定你有足够的电脑时间的机会。无论如何,感谢坚持DRY。 – 2010-09-11 21:49:03