我的perlin噪音发生器有什么问题?

时间:2016-06-15 17:18:55

标签: c++ math perlin-noise

我正试图为学校的数学作文产生柏林噪音,而且我在找出背后的数学时遇到了一些困难。这是我的perlin课程。 perlin噪声函数生成(应该生成)0到1之间的数字,然后乘以255以将颜色应用于屏幕上的每个像素,请帮忙!

 #include "perlinnoise.h"



perlinnoise::perlinnoise()
{
srand(time(NULL));

double random = rand() % 1000;
for (int i = 0; i < (651 * 2); i = i + 2)
{
    random = (rand() % 1000);
    vecGrad[i] = random / 1000;
    vecGrad[i + 1] = vecGrad[i];
    vecGrad[i] = cos(vecGrad[i] * 2 * 3.1416);
    vecGrad[i + 1] = sin(vecGrad[i + 1] * 2 * 3.1416);
}
}

int perlinnoise::perlinNoise(int x, int y)
{
//20 pixel in each case
//30 boxes in width and 20 boxes in height
//651 vectors to create


sf::Vector2i boxXY;
boxXY.x = ((x / 20));
boxXY.y = ((y / 20));

sf::Vector2i displacement1;     displacement1.x = x - boxXY.x * 20;     displacement1.y = y - boxXY.y * 20;
sf::Vector2i displacement2;     displacement2.x = x - (boxXY.x * 20 + 20); displacement2.y = y - boxXY.y * 20;
sf::Vector2i displacement3;     displacement3.x = x - boxXY.x * 20; displacement3.y = y - (boxXY.y * 20 + 20);
sf::Vector2i displacement4;     displacement4.x = x - (boxXY.x * 20 + 20); displacement4.y = y - (boxXY.y * 20 + 20);

/*std::cout << displacement1.x << std::endl; std::cout << displacement1.y << std::endl;
std::cout << displacement2.x << std::endl; std::cout << displacement2.y << std::endl;
std::cout << displacement3.x << std::endl; std::cout << displacement3.y << std::endl;
std::cout << displacement4.x << std::endl; std::cout << displacement4.y << std::endl;*/

double dotP1 = (vecGrad[((boxXY.y * 30) + boxXY.x)] * displacement1.x) + (vecGrad[(boxXY.y * 30) + boxXY.x + 1] * displacement1.y);
double dotP2 = (vecGrad[((boxXY.y * 30) + boxXY.x + 3)] * displacement2.x) + (vecGrad[(boxXY.y * 30) + boxXY.x + 4] * displacement2.y);
double dotP3 = (vecGrad[((boxXY.y * 30 + 1) + boxXY.x)] * displacement3.x) + (vecGrad[(boxXY.y * 30) + boxXY.x + 1] * displacement3.y);
double dotP4 = (vecGrad[((boxXY.y * 30 + 1) + boxXY.x + 3)] * displacement4.x) + (vecGrad[(boxXY.y * 30) + boxXY.x + 4] * displacement4.y);

这是我遇到麻烦的地方(我认为)

int intensity = 0;
double Sx = (3 * (x - boxXY.x * 20) * (x - boxXY.x * 20)) - (2 * (x - boxXY.x * 20) * (x - boxXY.x * 20) * (x - boxXY.x * 20));
double Sy = (3 * (y - boxXY.y * 20) * (y - boxXY.y * 20)) - (2 * (y - boxXY.y * 20) * (y - boxXY.y * 20) * (y - boxXY.y * 20));

double a = dotP1 + (Sx * (dotP2 - dotP1));
double b = dotP3 + (Sx * (dotP4 - dotP3));



double aa = dotP1 + (Sy * (dotP2 - dotP1));
double bb = dotP3 + (Sy * (dotP4 - dotP3));

intensity = (a+b+aa+bb)/4;
//Should generate number between 0 and 1, but doesn't :/

return intensity;

}

perlinnoise::~perlinnoise()
{
}

我一直在阅读很多文章,而且他们都非常不清楚所使用的数学。我最终生成了一个每个20 * 20像素的网格,网格中的每个横截面都随机生成渐变矢量。然后我计算位移矢量,然后用位移和梯度矢量在四个角上做点积。第一部分有点乱,因为我不是很有经验,但最后一部分更直接一点。我在x和y轴上使用平滑函数并使用该数字生成a,b,aa和bb,然后我取平均值。这就是我从我读过的文章中所理解的,但显然它是错的:/请帮忙吗? 提前谢谢!

0 个答案:

没有答案
相关问题