Coding/Misc

Poisson Disc Sampling - 2차원 패턴 랜더마이징 알고리즘

smores 2022. 11. 10. 21:16

업무상 자주 2차원 랜덤패턴, 또는 2차원 공간에서의 파라메터 랜더마이징이 필요할때가 있습니다. 1차원이라면 그냥 python 의 shuffle 또는 랜덤 함수만으로도 그럭저럭 써먹곤 하는데 2차원에선 기껏 랜덤함수를 사용해도 비슷한 놈들끼리 몰리거나 위치가 뭉치는 (aggregation?) 현상이 일어나곤 합니다. 이걸 해결하기 위해서 입자들의 인력 (또는 척력) 에 의한 시스템의 최소 에너지 상태로 최적화하는 molecular dynamics 알고리즘을 사용하여 오래전에 C++ 로 콘솔 실행용 프로그램을 만들어서 아직도 잘 써먹고 있습니다만, 많은 횟수의 iteration (최소 30회) 을 사용하고 모든 입자들의 위치를 재배치하는 과정이라 시간이 많이 걸립니다. 게다가 실행파일로 된 것을 써먹기에 특정 프로그램 내에 코드로 간단히 넣어서 사용할 수 없어서 불편함이 있기에 좋은 방법이 있을까 고민하다 우연히 이런 알고리즘이 있다는 것을 알게 됬습니다.

 

https://bl.ocks.org/mbostock/1893974 | Mitchell’s Best-Candidate - bl.ocks.org
https://gist.github.com/mbostock/1893974 | Mitchell’s Best-Candidate · GitHub
https://www.jasondavies.com/poisson-disc/ | Poisson-Disc Sampling
https://sighack.com/post/poisson-disk-sampling-bridsons-algorithm | Poisson Disk Sampling in Processing · Sighack
https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf | bluenoise.dvi

 

엄청 빨라서 좋기는 한데, 내 코드에 적용하려니 다시 공부를 해야 한다는... ㅠㅠ

 

게다가 이 방법으로 상하, 좌우 stitching 가능한 랜덤 패턴도 가능할지 잘 모르겠고, 2차원 공간에서 밀도 변화가 있는 경우도 대응 되는지 잘 모르겠고...

 

결국 귀찮아서 직접 만든 molecular dynamics randomizer 를 마냥 사용하고 있는 중... ㅠㅠ  시간날때 제대로 좀 공부를 해 봐야 할거 같습니다.

 

 

 

아래는 직접 만든 molecular dynamics 기반의 패턴 랜더마이저로 만든 유닛을 상하좌우 stitching 해도 seam 라인같은게 없이 깨끗하게 연결되는 것을 확인한 경우입니다.

 

'Coding > Misc' 카테고리의 다른 글

랩탑 배터리 수명 체크  (0) 2023.01.05
Lua 기초  (0) 2022.12.12
리사주 스피로그래프  (0) 2022.07.04
matlab, golang, html examples  (0) 2021.07.09
Librecad ascii txt based batch  (0) 2021.07.09