メタレクト
先日書いたページ 「 画像処理によるメタボール表現(2020.05.17) 」 では、等電位面のアナロジーからくる、 溶融するような表現を実現する meta-ball に関する話をしました。
このページでは、以下のツィートに示すように、 電荷を中心とする球面上の分布ではなく、 ある分布関数により決定される等ポテンシャル面としての メタな四角形 meta-rect を表す描画を行います:
文字数超過で、つぶやきProcessing できず。
— Koji Saito (@KojiSaito) May 18, 2020
Title: pseudo meta-rect (擬似的なメタ四角形)
昨日の加色混合によるメタボールの応用です。
四角形同士の近い部分が溶け合って融合してます。
描画関数
def M(x,y,r):
for t in range(r):s=r-t;stroke(pow(t*1./r,2)*255);rect(x-s/2,y-s/2,s,s) pic.twitter.com/LHSiBZcctC
このツィートでは「擬似的なメタ四角形」と 書いていますが、これはポテンシャルが距離の関数として表される、という 前提をおいた場合の話です。
下のプログラムを見てもらえば分かると思いますが、 必ずしもポテンシャルの値は四角形の中心からの距離に比例する値にはなっていません。 なので「擬似的」と表現しています。
もちろん、数学的には、もっと自由な形でのポテンシャル関数を設計することも可能なので、 そうい意味では「疑似」ではなく、まったく正当な meta-rect であると言えます (が、やっぱり距離の関数としてのポテンシャルを期待しますよね、普通…)。
プログラム
meta-rect といっても、特に難しいことはなく、 画像処理によるメタボール表現と同様に、 ある点を中心とする四角形(枠線)を何重にも重ねて描画し、 それを画像処理するだけです。
メタボールのときと同様に、枠線の色でポテンシャルを表すようにします。
以下、文字数超過でつぶやけなかったソースコードとなります:
def setup():
size(500,400)
noFill()
strokeWeight(3)
blendMode(ADD)
def M(x,y,r):
for t in range(r):
s=r-t
stroke(pow(t*1./r,2)*255)
rect(x-s/2,y-s/2,s,s)
def draw():
clear()
push()
translate(200,200)
rotate(frameCount*.01)
M(0,0,95)
pop()
M(300,200,110)
M(128,250,80)
filter(THRESHOLD,.1)
処理内容としては、 「 画像処理によるメタボール表現(2020.05.17) 」 と全く同じです。
ただ単に四角形になっただけ。 ただそれだけのプログラムとなってますが、 これは様々な図形でメタボール的な表現が可能であることに他なりません。
meta-rect ならぬ meta-shape な表現も可能なのですが、 それはまた別の記事で説明したく思います。