aboutsummaryrefslogtreecommitdiff
path: root/sketches/05/dragon.rkt
blob: 9cca29536dceca6de48a4047ecd6df7330a40878 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#lang sketching

(define (setup)
  (size 200 200)
  (frame-rate 1)
  (loop))

(define iterations 14)
(define init-segment 400)

(define Line cons)
(define ->0 car)
(define ->1 cdr)
(define Point cons)
(define ->x car)
(define ->y cdr)

(define (draw/line my-line)
  (let [ (p1 (->0 my-line)) (p2 (->1 my-line)) ]
    (line (->x p1) (->y p1) (->x p2) (->y p2))))

(define (split-line my-line dir)
  (let* [
         (x1 (->x (->0 my-line)))
         (y1 (->y (->0 my-line)))
         (x2 (->x (->1 my-line)))
         (y2 (->y (->1 my-line)))
         (len (dist x1 y1 x2 y2))
         (sidelen (sqrt (/ (* len len) 2)))
         (theta (atan2 (- y2 y1) (- x2 x1)))
         (slope (+ theta (* (/ pi 4) dir)))
         (p3 (Point
              (+ x1 (* sidelen (cos slope)))
              (+ y1 (* sidelen (sin slope)))))
         ]
    (cons (Line (->0 my-line) p3) (Line p3 (->1 my-line)))))

(define (dragon-curve my-line dir iteration)
  (let [ (lines (split-line my-line dir)) ]
    (if (<= iteration 0)
        (list (->0 lines) (->1 lines))
        (append
         (dragon-curve (->0 lines) 1 (- iteration 1))
         (dragon-curve (->1 lines) -1 (- iteration 1))))))

(define current-iteration 0)
(define (draw)
  (background 150)
  (let* [
         (p1 (Point (- (/ width 2) (/ init-segment 2)) (/ height 2)))
         (l1 (Line p1 (Point (+ (->x p1) init-segment) (->y p1))))
         (lines (dragon-curve l1 1 current-iteration))
         ]
    (stroke-weight 2)
    (stroke 0 0 0)
    (for-each draw/line lines)
    (if (= current-iteration iterations)
        (no-loop)
        (set! current-iteration (+ current-iteration 1)))))