Skip to content

Commit 2d93edd

Browse files
committed
Changing layout of code to adapt to text width
1 parent 46cad4a commit 2d93edd

1 file changed

Lines changed: 66 additions & 31 deletions

File tree

src/volumetric_clouds/main.clj

Lines changed: 66 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@
3535
;; Note that this article is about procedural generation and not about simulating real weather.
3636
;;
3737
;; ## Worley noise
38-
38+
;;
39+
;; [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) is a type of structured noise which is defined for each pixel using the distance to the nearest seed point.
40+
;;
41+
;; First we define a function to create parameters of the noise.
42+
;;
43+
;; * **size** is the size of each dimension of the noise array
44+
;; * **divisions** is the number of subdividing cells in each dimension
45+
;; * **dimensions** is the number of dimensions
3946

4047
(defn make-noise-params
4148
[size divisions dimensions]
@@ -75,7 +82,9 @@
7582

7683
(defn random-points
7784
[{:keys [divisions dimensions] :as params}]
78-
(tensor/clone (tensor/compute-tensor (repeat dimensions divisions) (partial random-point-in-cell params))))
85+
(tensor/clone
86+
(tensor/compute-tensor (repeat dimensions divisions)
87+
(partial random-point-in-cell params))))
7988

8089

8190
(facts "Greate grid of random points"
@@ -166,7 +175,8 @@
166175
(defn neighbours
167176
[& args]
168177
(if (seq args)
169-
(mapcat (fn [v] (map (fn [delta] (into [(+ (first args) delta)] v)) [-1 0 1])) (apply neighbours (rest args)) )
178+
(mapcat (fn [v] (map (fn [delta] (into [(+ (first args) delta)] v)) [-1 0 1]))
179+
(apply neighbours (rest args)) )
170180
[[]]))
171181

172182

@@ -180,20 +190,23 @@
180190
[{:keys [size dimensions] :as params}]
181191
(let [random-points (random-points params)]
182192
(tensor/clone
183-
(tensor/compute-tensor (repeat dimensions size)
184-
(fn [& coords]
185-
(let [center (map #(+ % 0.5) coords)
186-
division (map (partial division-index params) center)]
187-
(apply min
188-
(for [neighbour (apply neighbours division)]
189-
(mod-dist params (apply vec-n (reverse center))
190-
(apply wrap-get random-points neighbour))))))
191-
:double))))
193+
(tensor/compute-tensor
194+
(repeat dimensions size)
195+
(fn [& coords]
196+
(let [center (map #(+ % 0.5) coords)
197+
division (map (partial division-index params) center)]
198+
(apply min
199+
(for [neighbour (apply neighbours division)]
200+
(mod-dist params (apply vec-n (reverse center))
201+
(apply wrap-get random-points neighbour))))))
202+
:double))))
192203

193204

194205
(def worley (worley-noise (make-noise-params 256 8 2)))
195206

196-
(def worley-norm (dfn/* (/ 255 (- (dfn/reduce-max worley) (dfn/reduce-min worley))) (dfn/- (dfn/reduce-max worley) worley)))
207+
(def worley-norm
208+
(dfn/* (/ 255 (- (dfn/reduce-max worley) (dfn/reduce-min worley)))
209+
(dfn/- (dfn/reduce-max worley) worley)))
197210

198211
(bufimg/tensor->image worley-norm)
199212

@@ -218,9 +231,11 @@
218231

219232
(facts "Create unit vector with random direction"
220233
(with-redefs [rand (constantly 0.5)]
221-
(random-gradient 0 0) => (roughly-vec (vec2 (- (sqrt 0.5)) (- (sqrt 0.5))) 1e-6))
234+
(random-gradient 0 0)
235+
=> (roughly-vec (vec2 (- (sqrt 0.5)) (- (sqrt 0.5))) 1e-6))
222236
(with-redefs [rand (constantly 1.5)]
223-
(random-gradient 0 0) => (roughly-vec (vec2 (sqrt 0.5) (sqrt 0.5)) 1e-6)))
237+
(random-gradient 0 0)
238+
=> (roughly-vec (vec2 (sqrt 0.5) (sqrt 0.5)) 1e-6)))
224239

225240

226241
(defn random-gradients
@@ -230,16 +245,23 @@
230245

231246
(facts "Random gradients"
232247
(with-redefs [rand (constantly 1.5)]
233-
(dtype/shape (random-gradients {:divisions 8 :dimensions 2})) => [8 8]
234-
((random-gradients {:divisions 8 :dimensions 2}) 0 0) => (roughly-vec (vec2 (sqrt 0.5) (sqrt 0.5)) 1e-6)
248+
(dtype/shape (random-gradients {:divisions 8 :dimensions 2}))
249+
=> [8 8]
250+
((random-gradients {:divisions 8 :dimensions 2}) 0 0)
251+
=> (roughly-vec (vec2 (sqrt 0.5) (sqrt 0.5)) 1e-6)
235252
(dtype/shape (random-gradients {:divisions 8 :dimensions 3})) => [8 8 8]
236-
((random-gradients {:divisions 8 :dimensions 3}) 0 0 0) => (vec3 (/ 1 (sqrt 3)) (/ 1 (sqrt 3)) (/ 1 (sqrt 3)))))
253+
((random-gradients {:divisions 8 :dimensions 3}) 0 0 0)
254+
=> (vec3 (/ 1 (sqrt 3)) (/ 1 (sqrt 3)) (/ 1 (sqrt 3)))))
237255

238256

239257
(let [gradients (tensor/reshape (random-gradients (make-noise-params 256 8 2)) [(* 8 8)])
240258
points (tensor/reshape (tensor/compute-tensor [8 8] (fn [y x] (vec2 x y))) [(* 8 8)])
241-
scatter (tc/dataset {:x (mapcat (fn [point gradient] [(point 0) (+ (point 0) (* 0.5 (gradient 0))) nil]) points gradients)
242-
:y (mapcat (fn [point gradient] [(point 1) (+ (point 1) (* 0.5 (gradient 1))) nil]) points gradients)})]
259+
scatter (tc/dataset {:x (mapcat (fn [point gradient]
260+
[(point 0) (+ (point 0) (* 0.5 (gradient 0))) nil])
261+
points gradients)
262+
:y (mapcat (fn [point gradient]
263+
[(point 1) (+ (point 1) (* 0.5 (gradient 1))) nil])
264+
points gradients)})]
243265
(-> scatter
244266
(plotly/base {:=title "Random gradients" :=mode "lines"})
245267
(plotly/layer-point {:=x :x :=y :y})))
@@ -270,7 +292,9 @@
270292
(defn corner-vectors
271293
[{:keys [dimensions] :as params} point]
272294
(let [cell-pos (cell-pos params point)]
273-
(tensor/compute-tensor (repeat dimensions 2) (fn [& args] (sub cell-pos (apply vec-n (reverse args)))))))
295+
(tensor/compute-tensor
296+
(repeat dimensions 2)
297+
(fn [& args] (sub cell-pos (apply vec-n (reverse args)))))))
274298

275299

276300
(facts "Compute relative vectors from cell corners to point in cell"
@@ -286,24 +310,34 @@
286310
(defn corner-gradients
287311
[{:keys [dimensions] :as params} gradients point]
288312
(let [division (map (partial division-index params) point)]
289-
(tensor/compute-tensor (repeat dimensions 2) (fn [& coords] (apply wrap-get gradients (map + (reverse division) coords))))))
313+
(tensor/compute-tensor
314+
(repeat dimensions 2)
315+
(fn [& coords] (apply wrap-get gradients (map + (reverse division) coords))))))
290316

291317

292318
(facts "Get 2x2 tensor of gradients from a larger tensor using wrap around"
293319
(let [gradients2 (tensor/compute-tensor [4 6] (fn [y x] (vec2 x y)))
294320
gradients3 (tensor/compute-tensor [4 6 8] (fn [z y x] (vec3 x y z))) ]
295-
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 0 0) => (vec2 2 1)
296-
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 0 1) => (vec2 3 1)
297-
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 1 0) => (vec2 2 2)
298-
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 1 1) => (vec2 3 2)
299-
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 23 15)) 1 1) => (vec2 0 0)
300-
((corner-gradients {:cellsize 4 :dimensions 3} gradients3 (vec3 9 6 3)) 0 0 0) => (vec3 2 1 0)))
321+
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 0 0)
322+
=> (vec2 2 1)
323+
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 0 1)
324+
=> (vec2 3 1)
325+
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 1 0)
326+
=> (vec2 2 2)
327+
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 9 6)) 1 1)
328+
=> (vec2 3 2)
329+
((corner-gradients {:cellsize 4 :dimensions 2} gradients2 (vec2 23 15)) 1 1)
330+
=> (vec2 0 0)
331+
((corner-gradients {:cellsize 4 :dimensions 3} gradients3 (vec3 9 6 3)) 0 0 0)
332+
=> (vec3 2 1 0)))
301333

302334

303335
(defn influence-values
304336
[gradients vectors]
305-
(tensor/compute-tensor (repeat (count (dtype/shape gradients)) 2)
306-
(fn [& args] (dot (apply gradients args) (apply vectors args))) :double))
337+
(tensor/compute-tensor
338+
(repeat (count (dtype/shape gradients)) 2)
339+
(fn [& args] (dot (apply gradients args) (apply vectors args)))
340+
:double))
307341

308342

309343
(facts "Compute influence values from corner vectors and gradients"
@@ -333,7 +367,8 @@
333367
(ease-curve 1.0) => 1.0)
334368

335369

336-
(-> (tc/dataset {:t (range 0.0 1.025 0.025) :ease (map ease-curve (range 0.0 1.025 0.025))})
370+
(-> (tc/dataset {:t (range 0.0 1.025 0.025)
371+
:ease (map ease-curve (range 0.0 1.025 0.025))})
337372
(plotly/base {:=title "Ease Curve"})
338373
(plotly/layer-line {:=x :t :=y :ease}))
339374

0 commit comments

Comments
 (0)