Guest User

Untitled

a guest
May 27th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.06 KB | None | 0 0
  1.  
  2. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3.  
  4. (import (rnrs)
  5. (surfage s27 random-bits)
  6. (ypsilon ffi)
  7. (ypsilon cairo)
  8. (agave misc random-weighted)
  9. )
  10.  
  11. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. (random-source-randomize! default-random-source)
  14.  
  15. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16.  
  17. (define M_PI (* 2 (asin 1)))
  18.  
  19. (define (sq n) (* n n))
  20.  
  21. (define (norm v)
  22. (sqrt (+ (sq (vector-ref v 0))
  23. (sq (vector-ref v 1)))))
  24.  
  25. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  26.  
  27. (define (radians n)
  28. (* n (/ M_PI 180.0)))
  29.  
  30. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  31.  
  32. (define-record-type rgba
  33. (fields (mutable red)
  34. (mutable green)
  35. (mutable blue)
  36. (mutable alpha)))
  37.  
  38. (define-record-type hsva
  39. (fields (mutable hue)
  40. (mutable saturation)
  41. (mutable value)
  42. (mutable alpha)))
  43.  
  44. (define (clone-hsva obj)
  45. (make-hsva (hsva-hue obj)
  46. (hsva-saturation obj)
  47. (hsva-value obj)
  48. (hsva-alpha obj)))
  49.  
  50. (define (hsva->rgba color)
  51.  
  52. (let ((hue (inexact (hsva-hue color)))
  53. (saturation (inexact (hsva-saturation color)))
  54. (value (inexact (hsva-value color)))
  55. (alpha (inexact (hsva-alpha color))))
  56.  
  57. (let ((Hi (mod (floor (/ hue 60.0)) 6.0)))
  58.  
  59. (let ((f (- (/ hue 60.0) Hi))
  60. (p (* (- 1.0 saturation) value)))
  61.  
  62. (let ((q (* (- 1.0 (* f saturation)) value))
  63. (t (* (- 1.0 (* (- 1.0 f) saturation)) value)))
  64.  
  65. (case (exact Hi)
  66. ((0) (make-rgba value t p alpha))
  67. ((1) (make-rgba q value p alpha))
  68. ((2) (make-rgba p value t alpha))
  69. ((3) (make-rgba p q value alpha))
  70. ((4) (make-rgba t p value alpha))
  71. ((5) (make-rgba value p q alpha))))))))
  72.  
  73. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74.  
  75. ;; (define cr #f)
  76.  
  77. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  78.  
  79. (define color #f)
  80.  
  81. (define (adjust num)
  82. (lambda (val)
  83. (if (> num 0.0)
  84. (+ val (* (- 1.0 val) num))
  85. (+ val (* val num)))))
  86.  
  87. (define (hue num)
  88. (hsva-hue-set! color (mod (+ (hsva-hue color) num) 360)))
  89.  
  90. (define (saturation num)
  91. (hsva-saturation-set! color ((adjust num) (hsva-saturation color))))
  92.  
  93. (define (brightness num)
  94. (hsva-value-set! color ((adjust num) (hsva-value color))))
  95.  
  96. (define (alpha num)
  97. (hsva-alpha-set! color ((adjust num) (hsva-alpha color))))
  98.  
  99. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  100.  
  101. (define color-stack '())
  102.  
  103. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  104.  
  105. (define (cairo-set-source-rgba cr val)
  106. (cairo_set_source_rgba cr
  107. (rgba-red val)
  108. (rgba-green val)
  109. (rgba-blue val)
  110. (rgba-alpha val)))
  111.  
  112. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  113.  
  114. (let ((area-width 400)
  115. (area-height 400))
  116.  
  117. (let ((surface (cairo_image_surface_create CAIRO_FORMAT_ARGB32
  118. area-width
  119. area-height)))
  120.  
  121. (let ((cr (cairo_create surface)))
  122.  
  123. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  124.  
  125. (let ((x-low -3)
  126. (x-high 3)
  127. (y-low -2)
  128. (y-high 4))
  129.  
  130. (let ((width (- x-high x-low))
  131. (height (- y-high y-low)))
  132.  
  133. (cairo_scale cr area-width area-height)
  134.  
  135. (cairo_scale cr 1 -1)
  136.  
  137. (cairo_scale cr (/ 1.0 width) (/ 1.0 height))
  138.  
  139. (cairo_translate cr 3 -4)
  140.  
  141. ))
  142.  
  143. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  144.  
  145. (let ()
  146.  
  147. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  148.  
  149. (define (save)
  150. (set! color-stack (cons (clone-hsva color) color-stack))
  151. (cairo_save cr))
  152.  
  153. (define (restore)
  154. (cairo_restore cr)
  155. (set! color (car color-stack))
  156. (set! color-stack (cdr color-stack))
  157. (cairo-set-source-rgba cr (hsva->rgba color)))
  158.  
  159. (define (rotate n)
  160. (cairo_rotate cr (radians n)))
  161.  
  162. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  163.  
  164. (define (circle)
  165. (cairo-set-source-rgba cr (hsva->rgba color))
  166. ;; (cairo_arc cr 0.0 0.0 1.0 0 (* 2 M_PI))
  167. (cairo_arc cr 0.0 0.0 0.5 0 (* 2 M_PI))
  168. (cairo_fill cr))
  169.  
  170. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  171.  
  172. (define (unit-distance)
  173.  
  174. (let ((x (make-c-double 1.0))
  175. (y (make-c-double 0.0)))
  176.  
  177. (cairo_user_to_device_distance cr x y)
  178.  
  179. (norm (vector (c-double-ref x)
  180. (c-double-ref y)))))
  181.  
  182. (define (continue?)
  183.  
  184. (> (unit-distance) 1.0)
  185.  
  186. ;; (> (unit-distance) 0.5)
  187.  
  188. )
  189.  
  190. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  191.  
  192. (define black
  193.  
  194. (let ((random-index (lambda () (random-weighted '(60 1))))
  195.  
  196. (branch-a
  197.  
  198. (lambda ()
  199.  
  200. (save)
  201. (cairo_scale cr 0.6 0.6)
  202. (circle)
  203. (restore)
  204.  
  205. (save)
  206. (cairo_translate cr 0.1 0.0)
  207. (rotate 5)
  208. (cairo_scale cr 0.99 0.99)
  209. (brightness -0.01)
  210. (alpha -0.01)
  211. (black)
  212. (restore)))
  213.  
  214. (branch-b
  215.  
  216. (lambda ()
  217.  
  218. (save)
  219. (white)
  220. (restore)
  221.  
  222. (save)
  223. (black)
  224. (restore))))
  225.  
  226. (let ((branches (vector branch-a branch-b)))
  227.  
  228. (lambda ()
  229.  
  230. (when (continue?)
  231. (let ((branch (vector-ref branches (random-index))))
  232. (branch)))
  233.  
  234. ))))
  235.  
  236. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  237.  
  238. (define white
  239.  
  240. (let ((random-index (lambda () (random-weighted '(60 1))))
  241.  
  242. (branch-a
  243.  
  244. (lambda ()
  245.  
  246. (save)
  247. (cairo_scale cr 0.6 0.6)
  248. (circle)
  249. (restore)
  250.  
  251. (save)
  252. (cairo_translate cr 0.1 0.0)
  253. (rotate -5)
  254. (cairo_scale cr 0.99 0.99)
  255. (brightness 0.01)
  256. (alpha -0.01)
  257. (white)
  258. (restore)))
  259.  
  260. (branch-b
  261.  
  262. (lambda ()
  263.  
  264. (save)
  265. (black)
  266. (restore)
  267.  
  268. (save)
  269. (white)
  270. (restore))))
  271.  
  272. (let ((branches (vector branch-a branch-b)))
  273.  
  274. (lambda ()
  275.  
  276. (when (continue?)
  277. (let ((branch (vector-ref branches (random-index))))
  278. (branch)))
  279.  
  280. ))))
  281.  
  282. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  283.  
  284. (define (chiaroscuro)
  285. (brightness 0.5)
  286. (black))
  287.  
  288. (set! color (make-hsva 0.0 0.0 1.0 1.0))
  289.  
  290. (brightness -0.5)
  291.  
  292. (cairo-set-source-rgba cr (hsva->rgba color))
  293.  
  294. (cairo_rectangle cr -3 -2 6 6)
  295.  
  296. (cairo_fill cr)
  297.  
  298. (set! color (make-hsva 0.0 0.0 0.0 1.0))
  299.  
  300. (cairo-set-source-rgba cr (hsva->rgba color))
  301.  
  302. (chiaroscuro)
  303.  
  304. )
  305.  
  306. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  307.  
  308. (cairo_destroy cr))
  309.  
  310. (cairo_surface_write_to_png surface "chiaroscuro.png")
  311.  
  312. (cairo_surface_destroy surface)))
  313.  
  314. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Add Comment
Please, Sign In to add comment