« 2007年2月 | トップページ | 2007年5月 »

2007年3月21日 (水)

Perlで図形言語2

前回 につづきPerlで図形言語を作成。
前回上手くできなかった再帰的な図形もできました。
Square_limit_4

原因は関数呼ぶだけでいいところを、
関数を返してしまっていた事でした。

それから、線だけじゃなくて画像もできるように改造。
拡大は実数OKだけど、縮小は実数を使えないみたいで、
ある程度ウィンドウのサイズと画像を調整しないと上手くいかないのが、
よろしくないのですが、ここまでできました。
Corner_split_4

ソースはこんな感じ。

#!/usr/bin/perl -w
use strict;
use Tk;
require "picture.pl";

my $width  = 360;
my $height = 360;
my $top = MainWindow->new();
my $canvas = $top->Canvas(width => $width, height => $height);
my $image= $top->Photo( -file => 'ch2-Z-G-30.gif');
print $image->width, ":", $image->height, "\n";

my $frame = &make_frame(&make_vect(0, 0),
                                         &make_vect($width, 0),
                                         &make_vect(0, $height));
my $painter = &picture_painter_2($canvas, $image);
my $func = &corner_split($painter, 4);
&$func($frame);

$canvas->pack();
MainLoop();

顔写真は、本家のサイトから拝借しました。
ライセンス的にどうなんでしょうか?
だめだったらすぐ削除します。

あと、線分と画像の座標の取り方が違ったので、
線分の表示する所をちょこっと変更。

下の3つが使用したコードです。
picture2.pl
main - 線分の方
main2 - 画像の方

picture2.plとなっているのは、同名のファイルをアップロードしようとすると上書きになるためです。

使用したい方はご自由にお使い下さい。ただし、責任は持ちません。

| | コメント (2) | トラックバック (0)

2007年3月10日 (土)

Perlで図形言語

最近SICPという本をを読んでいます。
図形言語のところまで一応読み終わりました。

参考にしているサイトの一つがひげぽん OSとか作っちゃうかMona-なのですが、
図形言語の終わりの辺りにて

これを PerlやHakellなどのほかの言語で書く人が現れたら面白そうですね。

とあり、確かに面白そうだと思いPerlでやってみました。

とりあえず、できたものは↓です。
Sicp_picture


コードは

#!/usr/bin/perl -w
use strict;
use Tk;
require "picture.pl";

my @segments = (&make_segment(&make_vect(0.00, 0.80), &make_vect(0.15, 0.65)),
                        &make_segment(&make_vect(0.15, 0.65), &make_vect(0.25, 0.70)),
                        &make_segment(&make_vect(0.25, 0.70), &make_vect(0.35, 0.80)),
                        &make_segment(&make_vect(0.35, 0.80), &make_vect(0.35, 1.00)),
                        &make_segment(&make_vect(0.65, 1.00), &make_vect(0.70, 0.80)),
                        &make_segment(&make_vect(0.70, 0.80), &make_vect(0.65, 0.70)),
                        &make_segment(&make_vect(0.65, 0.70), &make_vect(0.75, 0.70)),
                        &make_segment(&make_vect(0.75, 0.70), &make_vect(1.00, 0.40)),
                        &make_segment(&make_vect(1.00, 0.20), &make_vect(0.65, 0.45)),
                        &make_segment(&make_vect(0.65, 0.45), &make_vect(0.70, 0.00)),
                        &make_segment(&make_vect(0.65, 0.00), &make_vect(0.50, 0.20)),
                        &make_segment(&make_vect(0.50, 0.20), &make_vect(0.35, 0.00)),
                        &make_segment(&make_vect(0.25, 0.00), &make_vect(0.35, 0.55)),
                        &make_segment(&make_vect(0.35, 0.55), &make_vect(0.30, 0.60)),
                        &make_segment(&make_vect(0.30, 0.60), &make_vect(0.25, 0.50)),
                        &make_segment(&make_vect(0.25, 0.50), &make_vect(0.00, 0.40)));

my $width  = 300;
my $height = 300;
my $top = MainWindow->new();
my $canvas = $top->Canvas(width => $width, height => $height);

my $frame = &make_frame(&make_vect(0, 0), &make_vect(300, 0), &make_vect(0, 300));
my $func = &segments_painter($canvas, @segments);
my $func2 = &flip_vect($func);
my $func3 = &below($func2, $func2);
my $func4 = &beside($func2, $func3);
&$func4($frame);

$canvas->pack();
MainLoop();

こんな感じ。
間単に説明すると、
"picture.pl"が図形を操作するためのライブラリ。
始めに、@segmentsが線の集合を宣言。
ウィンドウと描画領域を作り、そこにに線を描いていく。

 

図形描画にはTkを使用しました。
基本的にはSICPに載っていたコードや、練習問題で作ったコードを
Perlに翻訳していっただけです。

描画処理のタイミングの問題か、再帰的に行う描画(こういうの)は
うまくいきませんでした。
まあ、結構面白かったし、Perlのリファレンスに慣れることができたし良かったです。

| | コメント (0) | トラックバック (0)

« 2007年2月 | トップページ | 2007年5月 »