SICPを読む(60) 図形言語の準備 ひげぽんの図形言語をMrEdで動かそう
僕はVimperなのでMzSchemeを愛用してます。しかし、MzScheme単体ではウィンドウを表示することが出来ないため、図形言語を試すことが出来ません。今回の図形言語ではPLT/MzScheme付属のPLT/MrEdというソフトを使うことにします。
ひげぽんの図形言語を貰ってきて
ひげぽんの図形言語のソースを貰ってきて
- 関数型言語の勉強にSICPを読もう - (18) 2章 - データによる抽象の構築 - 2.2.4 図形言語 解説とソース - ひげぽん OSとか作っちゃうかMona-
- 素晴らしいソースです。後で写経する予定。
main.scmの代わりを用意する。
main.ss
;; ひげぽんの図形言語をMrEdで動かす為のパッチ (load "./segment.scm") (load "./frame.scm") (load "./vector.scm") (load "./painter.scm") (define frame (make-frame (make-vect 0 0) (make-vect 1 0) (make-vect 0 1))) (define segments (list (make-segment (make-point 0.2 0.7) (make-point 0.3 0.9)) (make-segment (make-point 0.4 0.7) (make-point 0.3 0.9)) (make-segment (make-point 0.6 0.7) (make-point 0.7 0.9)) (make-segment (make-point 0.8 0.7) (make-point 0.7 0.9)) (make-segment (make-point 0.3 0.5) (make-point 0.4 0.6)) (make-segment (make-point 0.6 0.6) (make-point 0.7 0.5)) (make-segment (make-point 0.5 0.2) (make-point 0.6 0.4)) (make-segment (make-point 0.5 0.2) (make-point 0.4 0.4)) (make-segment (make-point 0.45 0.3) (make-point 0.55 0.3)) (make-segment (make-point 0.85 0.6) (make-point 0.9 0.4)) (make-segment (make-point 0.85 0.2) (make-point 0.9 0.4)) )) (define monar (segments->painter segments)) (define window-size 300) (define window (instantiate frame% ("Higepon's Picture Language with MrEd") (width window-size) (height window-size))) (define canvas (instantiate canvas% (window))) (define dc (send canvas get-dc)) (define black-pen (instantiate pen% ("BLACK" 1 'solid))) (define (draw-line p1 p2) (define (t z) (- (* window-size z) 1)) (send dc draw-line (t (x-point p1)) (t (y-point p1)) (t (x-point p2)) (t (y-point p2)))) (send window show #t) (sleep/yield 1) (send dc set-pen black-pen) ((square-limit monar 4) frame)
あと、引数が間違ってるって怒られるので、修正。
(define (squash-inwards painter) ...)
参考
参考にしたのは、ここら辺。
PLT MrEd: Graphical Toolbox Manual
ほぼコピッペ(笑
追記
画像の表示は出来たけど、MrEdでは画像の拡大、回転は出来ない。
拡大、回転をさせるためには、
画像 → ビットマップオブジェクト → ベタバイナリ → 加工 → ビットマップオブジェクト → 表示
とやるらしい。
MITのprmpnt.scmが加工をやってる。面白い。
追記2
再描画の際に画面が消えてしまうのでcanvasにコールバックを追加した方がいいかも。