書名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
0.6.1 映射噪聲
1昼窗、如何處理得到的噪聲值
??我們開始研究如何處理得到的噪聲值甸祭。
- 得到0~1的噪聲值之后查刻,我們需要將它映射到我們想要的范圍內(nèi)
- 最方便的方法是使用Processing的map()函數(shù)。
map()函數(shù)有5個(gè)參數(shù)涎显。
第一個(gè)參數(shù)是我們想要映射的值(這里即n)崔兴,
后面的兩個(gè)參數(shù)是該值原來的范圍(最大值和最小值),
最后兩個(gè)參數(shù)是目標(biāo)范圍矢腻。
圖0-8
2、映射
??我們知道噪聲函數(shù)的返回值在0~1的范圍內(nèi)射赛,但我們想要在0到窗口寬度的范圍內(nèi)畫這個(gè)圓多柑。
float t = 0;
void draw() {
float n = noise(t);
float x = map(n,0,1,0,width); 用map()函數(shù)定制Perlin噪聲的范圍
ellipse(x,180,16,16);
t += 0.01;
}
3、Perlin噪聲游走模型
class Walker {
float x, y;
float tx, ty;
float prevX, prevY;
Walker() {
tx = 0;
ty = 10000;
x = map(noise(tx), 0, 1, 0, width);
y = map(noise(ty), 0, 1, 0, height);
}
void render() {
stroke(255);
line(prevX, prevY, x, y);
}
// Randomly move according to floating point values
void step() {
prevX = x;
prevY = y;
x = map(noise(tx), 0, 1, 0, width);
y = map(noise(ty), 0, 1, 0, height);
tx += 0.01;
ty += 0.01;
}
}
- 請(qǐng)注意上面的例子是如何使用tx和ty這對(duì)變量做參數(shù)的楣责。
我們同時(shí)需要跟蹤兩個(gè)時(shí)間變量竣灌,一個(gè)用于產(chǎn)生游走對(duì)象的x坐標(biāo),另一個(gè)用于產(chǎn)生y坐標(biāo)秆麸,
但是這兩個(gè)變量還有一些奇怪的地方帐偎,為什么tx從0開始,而ty從10 000開始蛔屹?
盡管這兩個(gè)初始值是隨意確定的,但我們故意用了不同的值來初始化這兩個(gè)時(shí)間變量豁生。
這是因?yàn)樵肼暫瘮?shù)的返回結(jié)果是確定的:無論何時(shí)調(diào)用它兔毒,只要傳入的時(shí)間點(diǎn)t相同,返回的結(jié)果也相同甸箱。
如果我們通過同一個(gè)時(shí)間點(diǎn)t獲取兩個(gè)坐標(biāo)育叁,返回的x坐標(biāo)和y坐標(biāo)會(huì)是相等的,這意味著游走對(duì)象Walker只會(huì)在一條對(duì)角線上移動(dòng)芍殖。
在這里豪嗽,我們用了噪聲空間的兩個(gè)不同區(qū)域,x坐標(biāo)對(duì)應(yīng)的區(qū)域從0開始,y坐標(biāo)對(duì)應(yīng)的區(qū)域從10 000開始龟梦,這樣x坐標(biāo)和y坐標(biāo)就會(huì)彼此獨(dú)立隐锭。
圖0-9
- 實(shí)際上,Perlin噪聲是沒有時(shí)間軸這個(gè)概念的计贰。
為了讓大家更容易地理解噪聲函數(shù)的工作方式钦睡,我引入了時(shí)間軸這個(gè)隱喻。但是躁倒,我們應(yīng)該有空間的概念荞怒,而不該有時(shí)間軸的概念。
上圖描述了噪聲序列在一維空間上的排列秧秉,我們可以獲取任意x坐標(biāo)上的噪聲值褐桌。
比如,你經(jīng)常會(huì)在噪聲圖中看到一個(gè)叫xoff的變量象迎,它表示x軸上的偏移量荧嵌,取代上面說的時(shí)間點(diǎn)變量t(見圖表注解)。