src/looms/005-simple-triangulations.lisp @ 148a6a1cc9eb

Add simple triangulations
author Steve Losh <steve@stevelosh.com>
date Tue, 06 Mar 2018 22:40:20 -0500
parents (none)
children abd8097693a4
(in-package :flax.looms.005-simple-triangulations)

;; https://mattdesl.svbtle.com/pen-plotter-1

(defparameter *point-size* 0.004)

(defun convert-point (point)
  (flax.drawing:circle point *point-size*))

(defun convert-triangle (tri)
  (destructuring-bind (a b c) tri
    (flax.drawing:triangle a b c)))

(defun convert (points)
  (append
    (map 'list #'convert-point points)
    (map 'list #'convert-triangle (triangulate points))))

(defun triangulate (points)
  (mapcar (lambda (indexes)
            (map 'list (curry #'aref points) indexes))
          (lofi.tri:triangulate (map 'vector #'coord-to-cons points))))

(defun gauss ()
  (clamp 0.0 1.0 (random-gaussian 0.5 0.15 #'rand)))

(defun generate-point-uniform ()
  (coord (rand 1.0) (rand 1.0)))

(defun generate-point-gaussian ()
  (coord (gauss) (gauss)))

(defun generate-point-gaussian-vertical ()
  (coord (rand 1.0) (gauss)))

(defun generate-point-gaussian-horizontal ()
  (coord (gauss) (rand 1.0)))

(defun generate (generator n)
  (iterate (repeat n)
           (collect (funcall generator) 
                    :result-type 'vector)))

(defun loom (seed points filename filetype width height)
  (losh::clear-gaussian-spare)
  (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)
          (random-elt '((generate-point-uniform "Uniform")
                        (generate-point-gaussian "Gaussian")
                        (generate-point-gaussian-vertical "Vertical Gaussian")
                        (generate-point-gaussian-horizontal "Horizontal Gaussian"))
                      #'rand)
        (flax.drawing:render canvas (convert (generate generator points)))
        generator-name))))


;; (time (loom nil (* 10 (random 100)) "out" :png 800 800))