Uniformt fordelt kugleoverflade

I Monte-Carlo pathtracing har man brug for punkter som er uniformt fordelte på enhedskuglen S2.

Jeg har kode som finder perfekt uniformt fordelte punkter i [0,1]×[0,1] og har nu fundet en uniform mapning derfra til S2.

Den beror på, at hver af de tre koordinater for uniformt fordelte punkter på S2 faktisk er uniformt fordelte på [0,1]. De tre koordinater er selvfølgelig ikke uafhængige.

Man kan derfor vælge een akse (her z-aksen) og finde en uniformt fordelt værdi på den akse. Dermed skal de resterende to koordinater findes på en cirkel parallelt til XY-planet med almindeligt trigonometri.

Lad (s,t) tilhøre [0,1]×[0,1]. Fastlæg z med det samme som 2s-1. Lad radius r = sqrt(1-z2). Lad placeringen på cirklen være φ = 2 t π. Så kan (x,y,z) udtrykkes som (r cos φ, r sin φ, z).

Sådan ser det ud i Scheme:

(define (plane->sphere p) (let* ((z (- (* 2 (car p)) 1)) (t (* 2 PI (cadr p))) (r (sqrt (- 1 (* z z))))) (vector (* r (cos t)) (* r (sin t)) z)))

Nedenstående viser omkr. 1000 Poisson-disk fordelte punkter mappet til en kugle.

Bemærk især, hvordan punkterne ikke klumper sammen omkring z-aksen.