2009-07-02

Sierpinski Triangle

下面的图形被称为"Sierpinski Triangle":
sierpinski triangle

生成它的代码很简单,比如用guile (需要guile-cairo):

(use-modules (cairo))

(define (polygon cr p1 p2 p3)
(let ((x1 (car p1))
(y1 (cdr p1))
(x2 (car p2))
(y2 (cdr p2))
(x3 (car p3))
(y3 (cdr p3)))
(cairo-move-to cr x1 y1)
(cairo-line-to cr x2 y2)
(cairo-line-to cr x3 y3)
(cairo-line-to cr x1 y1)))

(define (fill-tri cr x y size)
(polygon cr (cons x y)
(cons (+ x size) y)
(cons x (- y size))))

(define min-size 8.0)

(define (sierpinski-tri cr x y size)
(if (<= size min-size)
(fill-tri cr x y size)
(let ((new-size (/ size 2)))
(sierpinski-tri cr x y new-size)
(sierpinski-tri cr x (- y new-size) new-size)
(sierpinski-tri cr (+ x new-size) y new-size))))

(define surf (cairo-svg-surface-create 300 300 "foo.svg"))
(define ctx (cairo-create surf))

(cairo-set-source-rgba ctx 1 0.2 0.2 0.6)
(cairo-set-line-width ctx 2.0)

(sierpinski-tri ctx 25 275 255)

(cairo-stroke ctx)
(cairo-surface-finish surf)


如上,结果会保存在文件foo.svg中。

标签:

0 Comments:

发表评论

<< Home