본문 바로가기

6.수학과 알고리즘

[알고리즘] Worley Noise

Cellular Noise

1996년 Steven Worley의 "A Cellular Texture Basis Function" 논문에 기술되었다.Celluar Noise는 돌, 물, 세포 같은 질감을 비슷하게 표현할 수 있다. 아래 이미지를 보면 좀더 쉽게 이해할 수 있다.

작성자: ospace114@empal.com, http://ospace.tistory.com/

알고리즘

알고리즘은 간단하다.

  1. 그리드 영역 내에 랜덤한 임의 점들이 분산되어 있다.
  2. 실행할 때 그리드의 모든 점들이 랜덤한 임의 점들과 거리를 추출한다.(이웃으로 제한하여 효율적 계산 가능)
  3. 이 거리들 중에서 가장 작은 값을 선택한다.

구현

function noise(pts, x, y) {
  let min = 0.5;
  for(let k=0; k<pts.length; ++k) {
    let d = distance(pts[k][0], pts[k][1], x, y);
    min = Math.min(min, d);
  }
  return min;
}

function distance(x0, y0, x1, y1) {
  let dx = x1 - x0;
  let dy = y1 - y0;
  return Math.sqrt(dx*dx + dy*dy);
}

사용예

const width = 100;
const height = 100;
const pts = [[0.1, 0.2], [0.7, 0.3], [0.2, 0.7], [0.8, 0.7], [0.5, 0.5]];

for(let i=0; i<height; ++i) {
  for(let j=0; j<width: ++j) {
    const val = noise(pts, j/width, i/height);
    console.log(j, ',', i, ':', val);
  }
}

Demo

참고

[1] Patricio Gonzalez Vivo & Jen Lowe, Cellular Noise, https://thebookofshaders.com/12/, 2022/02/10
[2] Worley noise, https://en.wikipedia.org/wiki/Worley_noise

반응형

'6.수학과 알고리즘' 카테고리의 다른 글

나비에-스토크스(Navier-Stokes) 방정식  (0) 2023.01.03
랑그랑주 역학  (0) 2022.12.28
[알고리즘] Perlin Noise  (0) 2022.01.24
hash 함수 기본  (0) 2012.01.09
정말 좋은 수학기호 모음  (0) 2008.11.14