๋งต
์๋ฌด ์์ ์๋ ๋
์ฑ์ง + ์๋ ต ๊ฐ๋ฅ ์์ ์๋ ๋
์์์ ์๋ ๋
๊ธ ์๋ ๋
๊ธ์ ์๋ ๋
์์ฌ ์๋ ๋
์ํ ์๋ ๋
์ด๋ป๊ฒ ํ๋๋ฉด, 3์ฐจ์ perlin noise ๊ตฌํ ๋ ๊ฒ์ ์ผ๋จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ ธ์ด. ๊ทธ ๋ค์ ๊ฐ ์์๋ง๋ค perlin noise์์ ์ธ ๋์ด๊ฐ๊ณผ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํจ. ๊ทธ ๋ค์ x์ y ์ขํ๋ฅผ ๊ฐ์ง ๊ฐ ํ์ผ๋ง๋ค ๋ชจ๋ ์์์ ๋ํด 'noise(x, y, ์์ ๋์ด) * ๊ฐ์ค์น' ๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ ์ค ๊ฐ์ฅ ๊ฐ์ด ๋๊ฒ ๋์จ ์์์ ๊ทธ ํ์ผ์ ๋ถ์ฌํจ.
์ฝ๋
letย resourcesย =ย [(0.0,ย 10.0),ย (0.2,ย 1.0),ย (0.4,ย 0.5),ย (0.6,ย 5.0),ย (0.8,ย 4.0),ย (1.0,ย 3.0)];
ย ย ย ย forย yย inย 0..MAP_SIZEย asย usizeย {
ย ย ย ย ย ย ย ย forย xย inย 0..MAP_SIZEย asย usizeย {
ย ย ย ย ย ย ย ย ย ย ย ย letย tileย =ย tiles.get_mut(&Point3::new(xย asย u32,ย yย asย u32,ย 0)).unwrap();
ย ย ย ย ย ย ย ย ย ย ย ย tile.resourceย =ย resources
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .iter()
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .map(|(a,ย b)|ย (perlin.get([xย asย f64ย /ย 12.3456789,ย yย asย f64ย /ย 12.3456789,ย *a])ย +ย 0.8660254)ย *ย b)
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .enumerate()
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .max_by(|(_,ย a),ย (_,ย b)|ย a.partial_cmp(b).unwrap_or(Ordering::Equal))
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .map(|(i,ย _)|ย i)
ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย .unwrap()ย asย u8;
ย ย ย ย ย ย ย ย }
ย ย ย ย }
ํ
๋๋ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํ๋ฆฐ ์ธ๊ฑฐ์ง๋ง ์๋ ํ๋ฆฐ ๋นผ๋ด๊ณ ๋ฐ์ค๋ก ๋๋ ค๋ฐ์๊ฒ ํ๋ฆฐ ์ฐ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๋๊น์ง ๋ฆฌ๋กคํด์ผ ํ๋๊ฒ ์๊ฐ์ ๋๋ฌด ์ก์๋จน์. ํน์ ๊ด๋ฌผ๋ค์ด x~y ์ฌ์ด๋ก ๋ฐฐ์น๋์ด์ผ ํ๋ค๊ณ ํ๋ฉด ๊ด๋ฌผ ์ฌ๋ฌ๊ฐ๊ฐ ๋๋ฉด ๋งค์ฐ ๋ง์ ๋ฆฌ๋กค์ด ํ์ํจ... ๋ฆฌ๋กค ์ํด์ฃผ๋ฉด ์๋์ ๋ฐ๋ผ์ ํ๋ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ ๋งต๋ ์์ฃผ ๋์ค๊ณ ์ด๋์ ๋ ๊ณ ๋ฏผํ ๊ฒ ๋ ๋ง๋๋ผ. ๊ทธ๋์ ๊ฑ ์ ํด๋์ ๋งต์ผ๋ก ํ๋กํ ์งํํ ๊น ๊ณ ๋ฏผ๋ ํ์. ๋๋ค์ฑ์ ์ค์ ํ๋ ์ด ํ ๋๋ ์๋ฏธ๊ฐ ์๋๋ฐ ํ๋กํ ๋ง๋ค๋๋ ๊ณ๋ฅต์ธ๋ฏ.