研究開発

ブロックを積む(4)

第4章 1次元的に並べる

ブロック塀なので1個では成り立ちません、並べましょう。

BeginXtrd( 0, 10 );
Rect( 10, 20, 60, 50 );
EndXtrd;
BeginXtrd( 0, 10 );
Rect( 60, 20, 110, 50 );
EndXtrd;
BeginXtrd( 0, 10 );
Rect( 110, 20, 160, 50 );
EndXtrd;
BeginXtrd( 0, 10 );
Rect( 160, 20, 210, 50 );
EndXtrd;
BeginXtrd( 0, 10 );
Rect( 210, 20, 260, 50 );
EndXtrd;

こんな書き方でもVectorScriptは動きます。ですが、仮に100個描くことになったらツライですよね。
あとから四角の大きさを変えることになったら悲劇ですよね。

そこで同じことを繰り返すなら、FOR文を使います。

FOR ii := 1 TO 10 DO
BEGIN
{処理}
END;

iiという変数がカウンターとなって、10回繰り返すプログラムとなります。
初期値を1として、1づつカウントアップしていき、10になるまでBEGINとENDの間を実行します。

変数の宣言は、VARというところで宣言します。プログラムの先頭で定義します。
iiは整数(INTEGER)として用意されます。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 1 TO 10 DO
BEGIN
{処理}
END;
END;
Run( sample );

横道にそれますが、VectorScriptで四則演算するには

Message( 1+2+3+4+5 );

のように書くだけで答えが得られます。

では1から100までだったらどうでしょう。

Message( 1+2+3 // 98+99+100 );

ありえません。FOR文を使いましょう。

PROCEDURE sample;
VAR
ii, total : INTEGER;
BEGIN
total := 0;
FOR ii := 1 TO 100 DO
BEGIN
total := total + ii;
END;
Message( total );
END;
Run( sample );

では、本題に戻って、四角形の座標のズレを計算にいれ、
x方向には+50、y方向には0ずつ座標を変化させましょう。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 9 DO
BEGIN
BeginXtrd( 0, 10 );
Rect( 10+ii*50, 20, 60+ii*50, 50 );
EndXtrd;
END;
END;
Run( sample );

次はy方向に描かせましょう。
x方向には0、y方向には+30ずつ座標を変化させましょう。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 9 DO
BEGIN
BeginXtrd( 0, 10 );
Rect( 10, 20+ii*30, 60, 50+ii*30 );
EndXtrd;
END;
END;
Run( sample );

z方向に描かせるにはどうしたらよいでしょう?
BeginXtrd のz座標を10ずつ変化させましょう。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 9 DO
BEGIN
BeginXtrd( 0+ii*10, 10+ii*10 );
Rect( 10, 20, 60, 50 );
EndXtrd;
END;
END;
Run( sample );

また、四角形の個数、大きさの変更も容易です。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 14 DO
BEGIN
BeginXtrd( 0, 10 );
Rect( 10+ii*25, 20, 35+ii*25, 50 );
EndXtrd;
END;
END;
Run( sample );

また、大きさの違う柱状体を交互に並べたりも可能です。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 9 DO
BEGIN
BeginXtrd( 0, 10 );
Rect( 10+ii*85, 20, 60+ii*85, 50 );
EndXtrd;
BeginXtrd( 0, 10 );
Rect( 60+ii*85, 20, 85+ii*85, 50 );
EndXtrd;
END;
END;
Run( sample );