ターゲットカラーを使う ターゲットカラーを使う

色相を変えながら、らせん状に回転する図形を描いてみます。

startshape colorCircles

background { b -1 }

rule colorCircles {
    simpleRect {}
    colorCircles { h 20 x 1.6 y 0.4 r 30 s 0.95 }
}

rule simpleRect {
    SQUARE { sat 1 b 1 s 2 1 }
}
spiral

backgroundで背景を黒にし、startshapeでcolorCirclesを呼び出しています。 colorCirclesはsimpleRectを呼び出した後、colorCircles自身を再帰呼び出しします。 再帰呼び出しの際に、移動・回転・スケール変更に加えて、色相(h)に20を足していますね。 これによって色相が20、40、60…と増えていき、色とりどりの四角形が描画されました。

ちなみに、Context Freeの色相(h)の値はモジュロ360(360で割った余り)になる仕様ですから、加算した値が360になると0になり、ふたたび(色相0は赤なので)赤から彩色されていきます。

では、シェイプの色を最初が緑(h 120)で、青(h 240)へと徐々に変わっていくようにするにはどうすればいいでしょう。

startshape colorCircles

background { b -1 }

rule colorCircles {
    simpleRect {}
    colorCircles { h 1.5 x 1.6 y 0.4 r 30 s 0.95 }
}

rule simpleRect {
    SQUARE { h 120 sat 1 b 1 s 2 1 }
}
spiral 2

simpleRectの色相(h)を緑(h 120)にして、colorCirclesの再帰呼び出し時に色相に1.5ずつ加算すれば、描画スケールぎりぎりの80個目の四角形で青になります。

80個目ではなく、途中の20個目あたりで四角形を青にしたい時はどうでしょう。 色の変化を早めるために、色相に追加する数値を1.5から6にしてみます。

startshape colorCircles

background { b -1 }

rule colorCircles {
    simpleRect {}
    colorCircles { h 6 x 1.6 y 0.4 r 30 s 0.95 }
}

rule simpleRect {
    SQUARE { h 120 sat 1 b 1 s 2 1 }
}
spiral 3

20個目で青くなった後も色相への加算が続くため、青を通り越した色が塗られてしまいました。 目的の色で彩色を終了するには別の手段が必要です。

startshape Start 

background { b -1 }

rule Start {
    colorCircles { |h 240 h 120 }
}

rule colorCircles {
    simpleRect {}
    colorCircles { h 0.1| x 1.6 y 0.4 r 30 s 0.95 }
}

rule simpleRect {
    SQUARE { sat 1 b 1 s 2 1 }
}
spiral 4

今度はうまくいきました。 このコードには、ターゲットカラーが使われています。 さきほどまでのコードと違い、startshapeはStartを一回だけ呼び出し、その後はcolorCirclesが再帰呼び出しでループするようにしました。 Startが呼び出すcolorCirclesには、色相のターゲットカラーとして“|h 240”が設定されています(hの前に|が付いていると、色相のターゲット値となります)。 その後ろのh 120は初期色(緑)です。 colorCirclesでは、四角形を描いてcolorCirclesを再帰呼び出しするのですが、その際に“h 0.1|”によって、ターゲットカラーまでの差分の10%(0.1)を色相に加算しています。 これによって、目標とする色相に徐々に近づいた色になるわけです。

厳密には、ターゲットカラーの差分比率によって制御された値(この例では色相)は、ターゲットカラーに無限に近づきますが、ターゲットカラーを超えることはありません。 この例では、最初の色相が120(初期値)、次はターゲットカラーまでの差分の10%が加算されるので、色相は120+(240-120)*0.1の132、次は132+(240-132)*0.1=142.8、その次は142.8+(240-142.8)*0.1=143.772といった具合に増えて行くだけで(アキレスと亀よろしく)ターゲットカラーと全く同じにはなりませんが、実用上は「同じ色になる」と思ってかまいません。

ターゲットカラーを使って、以前作成した木のイメージに色をつけてみましょう。

startshape Start 

rule Start {
    Tree { |h 120 |b 1 h 0 b 0 }
}

rule Tree 0.6 {
  SQUARE { sat 1 }
  Tree { h 0.03| b 0.02| y 1}
}

rule Tree 0.2 {
  CIRCLE { sat 1 y -0.5 }
  Tree { h 0.03| b 0.02| y -0.5 r 30 s 0.75 }
  Tree { h 0.03| b 0.02| y -0.5 r -30 s 0.75 }
}
tree

以前のコードに修正を加えた部分を解説します。 まず、初期値とターゲットカラーを設定するためstartshapeからStartを呼び出します。 Startでは、色相と明度を設定してTreeを呼び出します。 |h 120がターゲット色相の緑、|b 1がターゲット明度の1(最も明るい状態)で、h 0b 0が初期色と明度です(h 0は赤ですが、明度が0なので黒く表示されます)。 2つあるTreeの両方で、Treeを再帰呼び出しする際に、h 0.03|b 0.02|で色相と彩度を少しずつ上げていき、黒(実際は暗い赤)から緑へと彩色しています。 SQUARECIRCLEsat 1は彩度です。 彩度が指定されていないと、着色が無く濃淡のみになります。

できるようになった(はずの)こと
  1. ターゲットカラーを使って、色相や明度を変えながらシェイプを描画できる