アポロニウスのガスケット(1)
アポロニウスのガスケット(もしくはアポロニウスの網)という図形があります。
例えば Apollonian Gasket(Wolfram Mathworld)とか。
これは古代ギリシアの数学者であるペルガのアポロニウスに由来するものとのこと。見てのとおり、円を敷き詰めたものですが、これはデカルトの円定理を使えば簡単に描くことができます。
ソディの円、あるいは、デカルトの円定理
以下の条件を満たした3つの円A、B、C があるとします。
このとき、円A、B、C すべてに1点で接する円Dの半径を求める計算式があるという。
その計算には「曲率(円の半径の逆数)」というものを使います。
円Aの曲率を kA、円Bの曲率を kB、円Cの曲率を kC、円Dの曲率を kD としたとき、以下の計算式が成り立つとのこと。
(kA + kB + kC + kD)^2 = 2 * (kA^2 + kB^2 + kC^2 + kD^2)
この式を変形すると kD は以下のように導かれるらしいです。
kD = kA + kB + kC ± 2 * √(kA*kB + kB*kC + kC*kA)
この kD の逆数が円Dの半径になるわけです。
ところでこの式の右辺には ± が含まれています。ってことは値が2つ得られるということで、それはつまり円Dは2つあるわけです。
ひとつは3つの円A、B、Cが作る隙間の内側に配置される円。もうひとつは3つの円A、B、Cを取り囲むように配置される円。
以後、前者を内接円(円D)、後者を外接円(円E)と呼ぶことにします。
この計算式はフレデリック・ソディというイギリスの化学者が1937年にネイチャーに発表した「ソディの6球連鎖」の中にある公式で「ソディの円(soddy circles)」あるいは「ソディの公式」と呼ばれるものだそうです。
BitmapData#threshold 高速化
前回は BitmapData#peletteMap の高速化を見ましたが、今回は BitmapData#threshold の高速化についてです。
この検証については「入力元と出力先が異なる」という条件を設定しています。
条件部分を抜き出すと以下のような感じ。
var target:BitmapData = new BitmapData(source.width, source.height, transparent, color); target.threshold(source, rect, ZERO_POINT, ">=", _threshold << 8, 0xffffffff, 0x0000ff00, false);
結果は以下のとおり。
- source の transparent は false よりも true の方が速い
- source の transparent が同じなら、target の transparent には、あまり大きく左右されない
BitmapData#paletteMap 高速化
先日、ある縁から、以前 ActionScript 3.0 で作った画像処理フィルターのいくつかを見直すことになりました。
処理速度のチューンアップが命題になりまして、いろいろ試してみたところ、高速化を図れる要素がいくつか見つかりました。
しかし時は流れて、世は Stage3D 時代。そのフレームワークである Starling がもて囃されているらしい今日この頃。
今さら flash.display.BitmapData の高速化に如何ほどの需要があるのかはなはだ疑問ではありますが、というか ActionScript 自体の寿命すら危ぶまれてる気がしないでもないですが、せっかく知見を得たのでエントリーしようかと。
検証したのは BitmapData#peletteMap と BitmapData#threshold のふたつのメソッド。
今回は paletteMap の高速化についてです。
なお、コード開発環境は FlashDevelop 4.4.3 RTM。
過去のバージョン全削除。クリーン・インストールで、AS コンパイラや Flash プレイヤーも同時にインストールし直しました。
反応拡散系(7)
Gray-Scott モデルの方程式による反応拡散系について、基礎研究的なコードを組んできましたが、それらを踏まえてメディアアート的なものも作ってみたいと思います。
まずは、ユーザのマウス操作に対してインタラクティブな挙動をするものを組んでみました。
マウスドラックした部分とそうでない部分とで見栄えが変わります。↓