基本的な命令以外の複雑な曲線や図形を描く場合は、自分でそのような命令(関数)を作るか、誰かが作ったライブラリを利用するしかありません。中級編では、具体的な題材を扱いながら命令を作っていきます。
基本的な命令以外の複雑な曲線や図形を描く場合は、自分でそのような命令(関数)を作るか、誰かが作ったライブラリを利用するしかありません。中級編では、具体的な題材を扱いながら命令を作っていきます。
関数[*1]の定義は、次のようにします。
# 関数を定義 ●自作関数(引数A,引数B,引数C) 引数A+引数B+引数Cを戻す
呼び出すには、このようにします。
# 作った関数を呼び出す 自作関数(2,3,4)を言う
先程の例では、関数名()
で命令を呼び出しましたが、他の命令と同じように「AをBでC。」のように日本語的に呼び出したいですね。「引数+助詞+…+命令」の形で命令を呼び出せるようにするには、宣言文に助詞をつけるだけです:
●平行移動(X,YをA,Bだけ) 「{X+A},{Y+B}」を戻す
引数の型を明示することもできます。
●平行移動({数値}X,{数値}Yを{数値}A,{数値}Bだけ) 「{X+A},{Y+B}」を戻す
しかし、「平行移動」という変換命令としては少々不便です。XやYの値を直接書き換えられないからです:
X=100 Y=200 X,Yを300,400だけ平行移動 それを言う。 # 400,600 ... 平行移動している 「{X},{Y}」と言う。 # 100,200 ... 元の値のまんま
例えば、「AにBを直接足す
」命令は、 A
に変数を渡すとその変数の内容を直接 B
だけ増やします。ただの「足す
」命令では逆に、渡した変数の内容を直接書き換えたりはしません。
引数として渡した変数に破壊的な処理[*2]をしたい場合は、変数型として参照渡し型を指定します。C言語で言う所のポインタのようなものです。
●平行移動({参照渡し}X,{参照渡し}Yを{数値}A,{数値}Bだけ) XにAを直接足す。# X=X+A YにBを直接足す。# Y=Y+B
変数を書き換える命令は、命令の説明文を読むときちんと「変数の内容書き換える」と書いてあります。逆に、説明にそのように書いていない命令は全て普通の「値渡し」、つまり変数の内容を書き換えないタイプです。
では実際に回転命令を作ってみます。回転の詳しいアルゴリズムはここでは割愛しますが、点(x,y)を原点中心にθ[rad]回転した点(X,Y)を計算するには次の式を用います:
# 「X,YをPI/6だけ回転」のように使う ●回転({参照渡し}X,{参照渡し}Yをθだけ) xとは数値=X yとは数値=Y cosとは数値=COS(θ) sinとは数値=SIN(θ) X = x*cos - y*sin Y = x*sin + y*cos
変数X,Yの値を直接書き換えます(そのため、きちんと計算できるよう元々の変数X,Yの値を退避用の変数x,yにコピーして計算に用いていることに注意してください)。
また、θには弧度法単位[rad]で角度を指定する必要があります。度数法で角度を指定したい場合は次のように工夫してみましょう:
# 「X,Yを30度回転」のように使う ●度回転({参照渡し}X,{参照渡し}Yをθだけ) X,YをDEG2RAD(θ)だけ回転