naga:gnuplotを使った図形言語

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は必要なくなる。

なお、この方法の確認にあたって、naoya_t氏のサイトに公開されているwaveおよびmake-pathを使用させていただきました。ありがとうございました。
http://sicp.naochan.com/memo.pl?p=wave
http://sicp.naochan.com/memo.pl?p=make-path

タグ:

+ タグ編集
  • タグ:
最終更新:2008年01月27日 17:29
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。