用Racket语言写了一个万花筒的程序
来源:https://blog.csdn.net/chinazhangyong/article/details/79362394
https://github.com/OnRoadZy
https://blog.csdn.net/chinazhangyong
Racket语言是Lisp语言的一个方言。Lisp语言具有神奇的魔力,可以全方位诠释哲学,而不像其它语言主要能够表达数学。
这是我用它写的第一个完整程序,在此纪念一下下。
先来看看我的万花筒的神奇魅力,我相信以下画出来的图(带参数,可按参数重新绘出来)任何一个外边买的万花板都画不出来。不信来比:
- 这一个,注意全是尖角,中间空心呈方形:
- 这一个,花瓣中间的脉络全是直线,花心有两个圆:
- 能画出三角形吗?而且中间镶钻,两颗!
- 这个我画出来自己都被震撼了,如此的完美!
这个是不是超有立体感,不知进入了哪一个维度:
这一个,能不能找到冬天围脖的的温暖?不过哪个建筑这样修一定会拿大奖。
这个,怎么画出来的?(揭秘:将轨道起始角自图中值依次增加5并点画图按钮执行画图,经过N次之后,就出现这个神奇效果啦!)
这个,看起来很常规,不过,仔细看看!(揭秘:这是多次调整转轮半径后得到的效果。不过具体怎么的记不得了,可以自己去试。)
最后贴上源程序:
;=============================================================
;artascope.rkt
;主程序:
#lang racket
(require racket/gui)
(require racket/draw)
(require "model-simple.rkt")
(include "view-main.rkt")
(send main-frame show #t)
;=======================================================
;model-simple.rkt
;万花筒模型
(module model-simple racket
(provide draw-artascope
set-f-center
get-af0 set-af0 get-ap0 set-ap0
get-rf set-rf get-rw set-rw get-rp set-rp
get-step-aw set-step-aw
get-start-af set-start-af get-end-af set-end-af)
;定义全局参数:
(define f-center (cons 300 300))
(define af0 30)
(define ap0 20)
(define rf 300)
(define rw 210)
(define rp 100)
(define step-aw 30)
(define start-af 0)
(define end-af 7720)
;设置/取得绘图全局参数:
(define (get-af0) af0)
(define (set-af0 a) (set! af0 a))
(define (get-ap0) ap0)
(define (set-ap0 a) (set! ap0 a))
(define (get-rf) rf)
(define (set-rf r) (set! rf r))
(define (get-rw) rw)
(define (set-rw r) (set! rw r))
(define (get-rp) rp)
(define (set-rp r) (set! rp r))
(define (get-step-aw) step-aw)
(define (set-step-aw a) (set! step-aw a))
(define (get-start-af) start-af)
(define (set-start-af a) (set! start-af a))
(define (get-end-af) end-af)
(define (set-end-af a) (set! end-af a))
;取得绘图点的X、Y坐标:
(define xp
(lambda (xw ap)
(+ xw (* rp (cos (degrees->radians ap))))))
(define yp
(lambda (yw ap)
(+ yw (* rp (sin (degrees->radians ap))))))
;计算滚轮圆心X、Y坐标:
(define xw
(lambda (af)
(+ (car f-center) (* (- rf rw) (cos (degrees->radians af))))))
(define yw
(lambda (af)
(+ (cdr f-center) (* (- rf rw) (sin (degrees->radians af))))))
;计算af、dlt-af、ap值:
(define af
(lambda (dlt-af)
(+ af0 dlt-af)))
(define dlt-af
(lambda (dlt-aw)
(/ (* rw dlt-aw) rf)))
(define ap
(lambda (dlt-aw)
(- ap0 dlt-aw)))
;组合坐标值为点值:
(define (get-p dlt-aw)
(cons (xp (xw (af (dlt-af dlt-aw))) (ap dlt-aw))
(yp (yw (af (dlt-af dlt-aw))) (ap dlt-aw))))
(define cur-aw
(lambda (af)
(/ (* af rf) rw)))
;绘制万花筒:
(define draw-artascope
(lambda (dc)
(let ([p1 (get-p af0)])
(do ([dlt-aw (cur-aw (+ af0 start-af)) (+ dlt