aboutsummaryrefslogtreecommitdiff
path: root/sketches/05/dragon.rkt
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2023-11-18 14:58:24 +0530
committerAkshay Nair <phenax5@gmail.com>2023-11-18 14:58:24 +0530
commite81c764bd50ba3e0b34b3138078af0a372242988 (patch)
tree62dd513f46260c4ef7e2cda18526805d8c1e7bf6 /sketches/05/dragon.rkt
parentdcd918162dcb4d70b905cc562ae92d98a10045ce (diff)
downloadcreative-coding-playground-e81c764bd50ba3e0b34b3138078af0a372242988.tar.gz
creative-coding-playground-e81c764bd50ba3e0b34b3138078af0a372242988.zip
feat: dragon fractal
Diffstat (limited to 'sketches/05/dragon.rkt')
-rw-r--r--sketches/05/dragon.rkt60
1 files changed, 60 insertions, 0 deletions
diff --git a/sketches/05/dragon.rkt b/sketches/05/dragon.rkt
new file mode 100644
index 0000000..9cca295
--- /dev/null
+++ b/sketches/05/dragon.rkt
@@ -0,0 +1,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)))))
+