Methods

ここには,Gallery1~5で説明を省略した事項を載せています。数式を用いた記述を含みますが,用いている数学は理工系の知識のある方にとっては初歩的なものだと思います。ご興味のある方はご覧ください。ご意見や間違いの指摘等も歓迎します。

歪んだ同心円の描き方

当工房では「点描」の方法で絵を構成していくことが多いです。それは,当工房では幾何学的な絵よりも人間が描いた古典的な意味での絵に近いものを描きたいと思っているからです。当方で使用しているPythonのtkinterをはじめ,コンピュータで描画する環境には必ずと言っていいほど座標を指定して任意の大きさの円(または矩形等)を描く機能がありますから,これを利用すれば「点(小さい円)を打って絵を構成していく」ことは可能です。ただし,当工房で行っていることは最初から決まった色(知覚させたい色)のついた点を打っていくことだけであり,印象派の画家が行ったような複数の色の点を打ち見る人にその混合色を知覚させるような技法は用いていません。

以下に例として,Gallery 1に載せた「セザンヌのリンゴ」や「アボリジニアート風」の中の同心円を描く方法を説明します。
これは以下のように中心から外側に輪帯を描いていくというやり方です。

(1)同心円の中心の座標を(Xc,Yc)(X_{\mathrm{c}}, Y_{\mathrm{c}})とする。
(2)何層の同心円を描くかを決める。層の数をMMとする。
(3)一つの層の厚みをdrdrとする。
(4)一つの層の周方向に打っていく点(小さい円)の半径の「基準値」を,決める。それをR0R_{\mathrm{0}}とする。
(5)中心からmm番目の層に打つ点の個数NNを,その層の周の長さを点(小さい円)の直径で割った値と決める。N=int(2πr/2R0)N=\mathrm{int}(2πr/ 2R_{\mathrm{0}})となる。ここでint()\mathrm{int}()は整数化を意味し,r=mdrr=mdrである。
(6)打つべき点の座標は(Xc+rcosθ,Yc+rsinθ)(X_{\mathrm{c}}+r\mathrm{cos}θ, Y_{\mathrm{c}}+r\mathrm{sin}θ)となる。ただしθ=ndθθ=ndθdθ=2π/N=2R0/rdθ=2π/N=2R_{\mathrm{0}}/rであり,nn0N0~Nまでの整数である。

同心円を層状に描く場合の各量の関係(drと2Roは等しい必要はない)

以上を,nn0N0~Nまで,mm1M1~Mまで変化させる二重ループに入れれば描画されます。
色は層ごとに(場合によっては点ごとに)RGB値または色名のテキスト(*)で指定します。
通常,描く段階での一つの点の半径RdR_{\mathrm{d}}は,基準値R0R_{\mathrm{0}}とは異なる値に指定します。RdR_{\mathrm{d}}R0R_{\mathrm{0}}とほぼ同じにすれば点描の一つ一つの点が見える絵に,RdR_{\mathrm{d}}R0R_{\mathrm{0}}よりかなり大きくすれば点同士がつながり筆で塗っていった感じの絵になります。
層の厚みdrdrを大きく,層の数MMを小さくすれば粗な同心円となり,その逆にすれば密な同心円となります。

(*)Pythonのtkinterやmatplotlibで用いることのできる定義済み色名(named colors)のことです。

上記で描かれるのは,幾何学的な同心円(真円)です。
これに「手で描いたような味」を加えるために,次のことを行いました。

(A)同心円自体の形にゆるやかな(場合によっては大きな)歪をつける。
(B)(A)によって定まった点をさらに乱数によりごくわずかに動かす。
(C)点(小さい円)の半径も乱数により少しずつ変える。

(A)は,次のように行いました。
同心円を描く場合,その円の半径を次のように変調します。

r(θ)=r(1+f(θ))r(θ)=r(1+f(θ))

ここでrrは真円の半径,f(θ)f(θ)は角度θθによってゆるやかに変わる何らかの関数です。この関数としてはたとえば次のようなものを用います。

f(θ)=Aexp[(θθc)2R2]f(θ)=A\mathrm{exp}[-\frac{(θ-θ_{\mathrm{c}})^2}{R^2}]

これはガウス関数と呼ばれる関数で,θcθ_{\mathrm{c}}を中心として釣り鐘型の曲線をなし,RRはその広がりを,AAはピーク値を決めます。これを1+f(θ)1+f(θ)の形にして真円半径rrに掛け,上記の手続き(6)のrrr(θ)r(θ)に置き換えれば,描く円を歪ませることができます。AAを正にすると引っ張った形,負にすると押し込んだ形となります。

ガウス関数の例(A=1,R=100の場合)
角度により円を歪ませる場合


AAθcθ_{\mathrm{c}}RRはパラメータとして数字で与えます。一つの円に対し複数の歪を与える場合は

fi(θ)=Aiexp[(θθci)2Ri2]f_{i}(θ)=A_{i}\mathrm{exp}[-\frac{(θ-θ_{\mathrm{c}i})^2}{R_{i}^2}]
f(θ)=ifi(θ)f(θ)=\sum_{i}f_{i}(θ)

とします。パラメータAiA_{i}θciθ_{\mathrm{c}i}RiR_{i}は好きな個数だけ好きな値を指定します。これらを乱数で決めるのも一つの方法ですが,当工房では描く図形ごとに一つ一つ数字で指定しており,今までに描いた画像ではそのほうがよい結果が得られると感じています。
歪ませる形を決めるf(θ)f(θ)はガウス関数である必要はありませんが,ガウス関数は変化がゆるやかで値が一定範囲内に収まること,ピーク値AAや広がり幅RRと絵の関係を把握しやすいことなど便利な点が多いので,当工房では多用しています。

以上の説明から判るとおり,この方法は,「点描のステップに比べて大きな長さスケールで変化する関数を用いて描く線の形を変調する」と一般化できるので,同心円だけでなく,いろいろな形を描く際に適用できます。

(B)は,上記(A)によって定まった点(小さい円)の中心座標を,さらにごくわずかだけ乱数によって動かすということです。これは,(A)によってできる大きなスケールでの歪でなく,点1個ごとのわずかな位置のゆらぎを加えるということです。

(C)は,描く点(小さい円)の半径RdR_{\mathrm{d}}も,乱数によって変えていくということです。

(B),(C)により,絵を描く際のチリチリとした手の動き(ぶれ)に近いものができるように思います。(B),(C)はいずれも乱数を用いて行いますが,乱す度合は(B)ではごくわずか,(C)ではそこそこの大きさ,といった程度です。

今までにいろいろ描いてみた経験からは,(A),(B),(C)いずれも効果がありますが,人間が描いた感じを出すのに大きく関わっているのは(A)の「大きなスケールで歪をつける」ということであると感じます。

なお,「アボリジニアート風」の絵の中の一部の図形では点描の点同士がくっつきあっていません。これは,dθ=2π/N=2R0/rdθ=2π/N=2R_{\mathrm{0}}/rと,描く角度ステップdθを真円の半径rrを用いて定義しているからです。歪ませた後の局所的周長から角度ステップを決めればくっつき合わせることも可能ですが,離れていた方が面白いと感じましたのでそのままとしてあります。

タイトルとURLをコピーしました