gnuplotを使った図形言語(Windows)
SICPの図計言語の演習がgnuplotを使用すると簡単に実行できる。
SICPの図形言語で、SICPに記載されていない手続きはdraw-lineである。
draw-lineは(draw-line v1 v2)の形式で呼ばれ、v1、v2で示される点を結ぶ線分を表示する機能を持てばよい。v1およびv2の値は、unit squarに定義されたイメージを構成する座標から、実際に表示するフレームの座標にframe-coord-mapで写像された値である。
従ってdraw-lineにgnuplotで線分を表示させるコマンドを出力する機能を持たせ、それをgnuplotで適当な領域に表示させれば良い。
gnuplotの表示用コマンドを全てdraw-lineに出力させるのは無理があるので、
1)segment.gp : gnuplotの線分表示用データ用ファイル。最初は空。
2)plot.gp : gnuplotの線分表示用コマンドファイル。環境設定を行う。
load 'segment.gp' #segments、arrowで設定
#
set xrange [0:1] # 表示領域 0≦x,y≦1
set yrange [0:1]
set size 0.721,1.0 # 縦横を同じ長さに
unset border # 枠を表示しない
unset tics # 刻みを表示しない
unset key # keyを表示しない
plot [0:1] 0 with dot # y=0の線を0≦x≦1に目立たないように表示する
pause -1 # ダイアログを表示して入力待ち
の2つのファイルを使い、
gnuplot plot.gp
として実行する。
scheme側は
draw-line、gnuplot-frame、plotを
(define (draw-line s-seg e-seg)
(display "set arrow from ")
(display (xcor-vect s-seg))
(display ",")
(display (ycor-vect s-seg))
(display " to ")
(display (xcor-vect e-seg))
(display ",")
(display (ycor-vect e-seg))
(display " nohead")
(newline))
(define (plot painter)
(painter gnuplot-frame))
(define gnuplot-frame ;; gnu-plot の表示領域 0≦x,y≦1
(make-frame (make-vect 0.0 0.0)
(make-vect 1.0 0.0)
(make-vect 0.0 1.0)))
と定義しておいて、
例えばwaveの出力であれば
(plot wave)
の出力結果をsegment.gpに流し込めばよい。
続ければ
gosh ex2_49d.scm > segment.gp ; gnuplot plot.gp
とすればwave図形が表示される。
ポーズのダイアログが表示されるのがちょっとうるさいが、我慢。また、手続きplotの中でplot.gpの内容を書き出せばplot.gpは必要なくなる。
最終更新:2008年01月27日 17:29