シェイプをランダムに描く シェイプをランダムに描く

このコードを実行してみましょう。

startshape Random 

rule Random {
  20 * { x 1 } Zukei {}
}

rule Zukei {
  5 * { y 1 } CIRCLE {}
}

rule Zukei {
  5 * { y 1 } SQUARE {}
}

rule Zukei {
  5 * { y 1 } TRIANGLE {}
}
no weight

プリミティブ・シェイプが5個積み重なったものが、x軸方向に20個描画されます。 しかも、描画のたびに並びが変わります。 コードでは、startshapeがRandomというルールを呼び出し、Randomの中でZukeiというルールをx軸方向に1個分ずつ移動しながら、20回呼び出しています。 呼び出されるZukeiというルールは、なぜか3個あります。

Context Freeは、同じ名前のルールがあると、その中のいずれかをランダムに選択して描画します。 この例では、Zukeiという名前のルールが3つあり、その中のひとつをランダムに選んで描画しているので、描画結果が毎回違ったのです。

ランダム選択候補のルールが3つですから表示される確率はそれぞれ33.3%程度となりますが、この確率を変更することができます。ルール名と中カッコの間に数値を入れると、共通の名称を持つルールの数値(ウエイト)の合計値から比率を算出し、ランダム表示確率とすることができます(数値省略時は“1”となります)。さきほどのソースにウエイトを書き足して実行してみましょう。

startshape Random 

rule Random {
  20 * { x 1 } Zukei {}
}

rule Zukei 10 {
  5 * { y 1 } CIRCLE {}
}

rule Zukei 5 {
  5 * { y 1 } SQUARE {}
}

rule Zukei {
  5 * { y 1 } TRIANGLE {}
}
weight 1

CIRCLEを描画するルールZukeiのウエイトは10、SQUAREを描画するZukeiのウエイトは5、TRIANGLEを描画するZukeiのウエイトは省略されているので1となり、どのZukeiを描画するかは、10:5:1の比率で決まりますから、円が多く、正方形(つながって長方形になっています)がその次に多く、三角形は少なかったり全く無かったりという描画結果になるのです。

ウエイトによる同一ルールの描画確率変更は、後述する再帰呼び出しによるループの制御でよく使用します。

できるようになった(はずの)こと
  1. ウエイトを変更して、好みの比率でシェイプを描画できる