2.24.2009

Sierpinski Triangle

I've been playing around with Scheme (a dialect of Lisp (a weird language that I can't really describe)) by watching these videos and kind of just playing around. Today, I got a working Sierpinski triangle program. It's not particularly elegant, but it could be worse.

What's the best way to auto-convert spaces to non-breaking spaces?

; Draw a sierpinski triangle

; Get all six coords of vertices of equilateral triangle
; with tip at (x1, y1) and side length 'side'
(define (triangle x1 y1 side)
(let ((x2 (- x1 (/ side 2)))
(x3 (+ x1 (/ side 2)))
(y2 (- y1 (/ (* (sqrt 3) side) 2)))
(y3 (- y1 (/ (* (sqrt 3) side) 2))))
(list x1 y1 x2 y2 x3 y3)))

(define (draw-triangle g x1 y1 side)
(let ((tri (triangle x1 y1 side)))
(graphics-draw-line g (first tri)
(second tri)
(third tri)
(fourth tri))
(graphics-draw-line g (first tri)
(second tri)
(fifth tri)
(sixth tri))
(graphics-draw-line g (third tri)
(fourth tri)
(fifth tri)
(sixth tri))))

; Level-zero Sierpinski triangle is just a triangle
; Level-n triangle is three copies of level (n-1) triangle
(define (sier g n x1 y1 side)
(if (= n 0)
(draw-triangle g x1 y1 side)
(let ((tri (triangle x1 y1 (/ side 2))))
(sier g (- n 1) (first tri) (second tri) (/ side 2))
(sier g (- n 1) (third tri) (fourth tri) (/ side 2))
(sier g (- n 1) (fifth tri) (sixth tri) (/ side 2)))))

(define (new-sier g n x1 y1 side)
(graphics-clear g)
(sier g n x1 y1 side))

(define g (make-graphics-device 'win32 1000 1000))

;Call it like this:
(define side 2)
(new-sier g 6 0 (/ (* side (sqrt 3)) 4) side)

No comments: