トンボの翅をGrasshopperでモデリングしてみた
トンボの翅とボロノイ図形
この間、博物館に行きました。そこでふとトンボの標本を見ていると羽の模様に見覚えがありました。こんにちは、dp9のまるそうです。先月にGrasshopperを始めたのでちょくちょく題材を周りで見つけては遊んでいます。
これがトンボの翅です。横にいた人と「すごいボロノイっぽいですよね」という話をしていました。
ボロノイ図(ボロノイず、英語: Voronoi diagram)は、ある距離空間上の任意の位置に配置された複数個の点(母点)に対して、同一距離空間上の他の点がどの母点に近いかによって領域分けされた図のことである。特に二次元ユークリッド平面の場合、領域の境界線は、各々の母点の二等分線の一部になる。(Wikipedia)
噛み砕いていうと「いくつかの点があったら、ほかの点よりもその点が一番近い領域」を示したものになります。
上の三枚は別の説明です。母点からちょっとずつ円をニューッと大きくしていったらボロノイ図形になります。これで十分「一番近い領域を示している」というのがわかるでしょうか
改めてトンボの翅の画像です。ボロノイっぽいですよね。
仮にトンボの翅の発生が、いくつかの母点をもちそれが拡大していく、のようなモデルだったとしたらその結果がボロノイであることはなんら不思議ではありません。
とはいえボロノイっぽいからと言って本当にボロノイなのかはまだ疑問です。そこで実際にトンボの翅をモデリングしてみることにしました。
まずは直観に従いやってみる
まずは素直な直観に従ってやってみます。
単純に翅の線も太い奴と細い奴があるように思えますねえ。上の画像で囲った部分は太い線に囲まれた領域であり、このエリア内限定でボロノイ図が描かれていそう。
そこでRhinoceros上で以下のような曲線をまず作りました。トンボの翅の形および太い線部分の大まかな形。
そしてこのエリア内に点をランダムに配置してそこからボロノイ図を作っちゃう
こんな感じになった。Grasshopperは以下の通り。とりあえず各エリア内の始点の数(ボロノイ図形の数)はそのエリアの面積に比例するようにしました。
論文を見てみる
適当にやってみたはいいけどやはり違和感を感じる。少しググってみるとPNASで「トンボの翅の模様シュミレーションやってみた!」っていうものがあったのでそれを読んでみることにします。
Hoffmann J, Donoughe S, Li K, Salcedo MK, Rycroft CH. A simple developmental model recapitulates complex insect wing venation patterns. Proc Natl Acad Sci USA. 2018;115(40):9905-9910.
普通に英語なのでざっくりと書いてあることをまとめると以下の6つ。
①太い線と細い線の二種類があるよ
②まず太い線が決まる→細い線がボロノイで生成される
③ボロノイの母点は領域内に均等に配置されるよ
④太い線を忠実に再現すると細い線もほぼ忠実に再現できるよ
⑤より忠実に再現するにはヤゴのときの翅の形でボロノイを確定させる→成虫の翅に変形させると良いよ
⑥ボロノイ図の母点の数は翅の厚さに依存するよ
①と②と④に関しては直観の通りでした。
⑤と⑥は「へぇ~」って感じです。
再びモデリングする
論文で得た情報をもとにより精度の高いモデルを作りましょう。改良するポイントは次の二つかしら。
A:太い線をより似たものにする
B:ボロノイ図の母点を均等に配置する
それぞれ②と③に対応しています。
今回⑤と⑥についてはあきらめました。手元にトンボの翅もないですし厚さもはかれません。
まずは「太い線の再現」から。ちょっとだけそれっぽくしました。忠実にするのはそれはそれで面倒だったのでちょっと精度上げただけです・・・。
さて次は「ボロノイ図の母点の均等配置」です。
前のモデルでは「ランダムな点を指定した数、指定した領域内に生成し、それを母点とする」だけでした。
そこで「重心ボロノイ分割」の手法を使います。重心ボロノイ分割とはその名の通り「母点が領域の重心と一致するボロノイ図」です。
これはランダムに生成したボロノイ図をLloyd's Algorithm という手法を用いて近づけていくことができます。そこでGrasshopperで以下のようなCluster(オリジナルの関数)を作りました
やっていることはシンプルで「ボロノイ図をつくる」→「その重心を求める」→「重心を母点にしてボロノイ図をつくる」→「その重心を求める」→...といった具合です。繰り返すことで重心ボロノイ分割に近づくんだとか。
さて改めてモデルを組んでみました。先ほどの直観モデルにLloyd's Algorithm の4回ループを付け加えました。あと各エリア内の母点の数を手入力にしました。
さあ「太い線をより似たものにする」「ボロノイ図の母点を均等に配置する」の二つの改良でどう変わったでしょうか
よりトンボの翅っぽくなった!やったね!
レンダリングもしてみた
右下にパーツを落っことしているのはご愛敬で。
比較してみると、細い領域の部分の再現度が上がってそう。Lloyd's Algorithm の操作を通じてかしら
気づいたこと
「トンボ ボロノイ」で検索すると、素晴らしい研究が出てくる。これ、高校生だぜ・・・。トンボの翅がどんなボロノイ図形をしているかについて丁寧に考察をしている
トンボの翅脈にはなぜボロノイ構造が現れるのか ( 広島大学附属高等学校 3 年 中河 友里 濱野 彩音 山田 瑞季 )
この最後の考察に以下のような記述がある。
不均翅亜目のトンボの翅に現れるトンボボロノイは,正六角形充填(母点配置に一定の規則を持ち,強度面で優れる)が強度維持に果たす役割と, 乱数ボロノイ充填(ランダムに母点が配置され,強度面で少々劣る)のばらつきの両方を兼ね備えた平面充填であり,翅脈の間隔の点において,1枚の翅の中でも異なる特徴を持った部分が組み合わさった構成になっていると考えられる。
乱数ボロノイ充填と正六角形充填の両方を兼ね備えた平面充填であるそうだ。これについて正六角形とハニカム構造を関連付けることで強度を持たせているのではないかと考察を行っていたが、違う視点のほうがシンプルに説明できるのではないかと気づいた。
今回途中の操作で「重心ボロノイ分割」に近づけていく操作を行った。重心ボロノイ分割のWikipediaには以下のような記述がある
1次元と2次元では証明されているガーショの予想では、「漸近的には、最適な重心ボロノイ分割の全ての母点は、その次元の基本セルと一致する[1]」とされており、例えば2次元空間では、最適な重心ボロノイ分割の母点は正六角形となる。
つまりトンボの翅が乱数ボロノイ充填と正六角形充填の両方を備えているのは、「重心ボロノイ分割」に近い構造であるからと言えるのではないだろうか。その捉え方をすることで2つの要素を兼ね備えたものではなく、一つのルールにしたがってできるものと捉えることができるのではないだろうか。
再現できなかったところ・課題
実は参考にした論文でも再現できていないところがある。それは上の画像を見てもらうとわかる通り、翅の端っこのセルサイズが小さくなる、ということが再現できていない。これは成長の不均一性・翅の材質の不均一性に由来するのだろうか。
もしそうだとしたらモデリングするときは、「不均一な密度をもった領域をつくる」→「その平面上に重みづけボロノイを作成」→「xy平面に射影する」という手順をとればうまくできそうである。しかし難しそうである。
またこれは重要なのだが「うまくそのモデルでシュミレーションできる」から「それがトンボの翅の形成モデルを表している」とは言えないということである。
もしかすると「ボロノイとは全く違う関数なんだけどある範囲ではボロノイと同じ結果を示す」みたいな関数があるならば、トンボの翅の形成モデルはその可能性だって十分にありうる。入力と観測結果はいじれるけど、それが実際にトンボの翅で起こっていることかどうかを決めるのは慎重にならなくてはいけない。
今回は最終結果が同じになるようにモデルを組んだけど、発生過程で同じであるとは限らない。またボロノイ的でであることにトンボの進化上でのメリットがあるのかとかも気になるよね。
生き物のパターン形成の領域は大阪大学の近藤研究室あたりが先行しているので興味がある方はぜひ調べてみると良いと思います。
まとめ
ボロノイ図とLloyd's Algorithmの組み合わせでトンボの翅のモデリングができた!やったね!
文責:まるそう
この記事が気に入ったらサポートをしてみませんか?