src/looms/005-simple-triangulations.lisp @ 19aeb5ea3df9
Switch to 3d-vectors (partially)
| author | Steve Losh <steve@stevelosh.com> |
|---|---|
| date | Wed, 04 Apr 2018 23:37:07 -0400 |
| parents | 595e16056317 |
| children | ebe16cb914fb |
(in-package :flax.looms.005-simple-triangulations) ;; https://mattdesl.svbtle.com/pen-plotter-1 (defparameter *point-size* 0.003) (defun convert-point (point) (flax.drawing:circle (coord (vx point) (vy point)) (random-gaussian *point-size* (* 0.15 *point-size*) #'rand))) (defun convert-triangle (ratio tri) (when (randomp ratio #'rand) (destructuring-bind (a b c) tri (list (flax.drawing:triangle (coord (vx a) (vy a)) (coord (vx b) (vy b)) (coord (vx c) (vy c))))))) (defun convert (points ratio) (append (map 'list #'convert-point points) (mapcan (curry #'convert-triangle ratio) (triangulate points)))) (defun triangulate (points) (mapcar (lambda (indexes) (map 'list (curry #'aref points) indexes)) (lofi.tri:triangulate (map 'vector (lambda (p) (cons (vx p) (vy p))) points)))) (defun gauss () (clamp 0.0 1.0 (random-gaussian 0.5 0.15 #'rand))) (defun generate-point-uniform () (vec2 (rand 1.0) (rand 1.0))) (defun generate-point-gaussian () (vec2 (gauss) (gauss))) (defun generate-point-gaussian-vertical () (vec2 (rand 1.0) (gauss))) (defun generate-point-gaussian-horizontal () (vec2 (gauss) (rand 1.0))) (defun generate (generator n) (iterate (repeat n) (collect (funcall generator) :result-type 'vector))) (defun select-generator () (random-elt '((generate-point-uniform "Uniform") (generate-point-gaussian "Gaussian") (generate-point-gaussian-vertical "Vertical Gaussian") (generate-point-gaussian-horizontal "Horizontal Gaussian")) #'rand)) (defun loom (seed filename filetype width height &key ratio points) (nest (with-seed seed) (flax.drawing:with-rendering (canvas filetype filename width height :background (hsv 0.09 0.05 0.975))) (destructuring-bind (generator generator-name) (select-generator)) (randomly-initialize ((ratio (if (randomp 0.5 #'rand) 1 (random-range 0.05 0.2 #'rand))) (points (round-to (random-range-inclusive 100 1000 #'rand) 10)))) (progn (-<> (generate generator points) (convert <> ratio) (flax.drawing:render canvas <>)) (values generator-name points ratio)))) ;; (time (loom 55 "out" :svg 800 800 ))