Circle Packingアプレット


このアプレットは、授業の課題として作ったものです。
詳しい理論(双曲幾何など)はちゃんと勉強していないので、間違った説明もあるかもしれません。


Circle Packingとは、円をある範囲に隙間なく並べることです。このアプレットは、大きな円の中に円を隙間なく並べた図を描きます。(背景の絵を見てください。)

ここでは簡単に仕組みを説明します。そうしないと、使い方がわからないと思いますので。



ここで出てくるグラフとは、棒とか円とか折れ線とかの種類があるほうではなく、点同士の対応関係を表したものです。(怪しい説明ですが。)もちろん、数学用語です。
例えば、下の二つはグラフとしては同じものです。
さて、この『グラフ』Circle Packingがどう関係するかといえば、互いに接する円の中心を結んだものが、グラフになっているのです。
このアプレットは、入力したグラフから、それに対応するCircle Packingの絵を求めます。
簡単に『頂点の数が、円の数になる』程度に考えればOKです。


元になるグラフは、なんでもいいわけではありません。
下のような条件があります。
  1. グラフの辺が、全て三角形の形にならなければならない。
  2. 穴があいていてはならない。(三角形でない形が出来ているなど。)
  3. グラフの外側の点が、グラフの内部の点とつながっていなければならない。
詰め込まれた円の中心を接するもの同士結んでみれば、三角形ができるので1は明らかだと思います。

このアプレットで作るグラフは、上の条件のものしか作れないようになっています。(そのはずです。)
さて、実際の使い方を説明します。



使い方

上半分が、グラフを作る部分、下半分が、実際の絵が表示される部分です。
右のCLEARボタンは、グラフを初期状態に戻します。
DRAWボタンは、Circle Packingの絵を描きます。

グラフについて説明します。
まず、グラフの点(■)について説明します。
緑色の点は、内部の点を表します。
水色の点は、内部の点と直接つながっている外側の点を表します。
黄色の点は、内部の点と直接つながっていない外側の点を表します。

次に、について説明します。
青色の辺は、内部の辺を表します。
赤色の辺は、外部の辺を表します。

次に、どのようにグラフを作っていくのかを説明します。
 

上の方に書いた条件より、内部の点と直接つながっていない外側の点が存在してはいけないので、グラフをつくるときは、黄色の点がなくなるようにすればいいわけです。
黄色の点がまだ残っている状態でDRAWボタンを押しても、何も描かれませんのでご注意ください。

深いことは考えず、適当にいろいろ試してみてください。




注意

特に、描く円の数が多い時などには、時々円同士が離れてしまったり、重なってしまったりすることがあります。そのような時は、もう何回かDRAWボタンを押してみて下さい。どんどん正確になっていきます。
同じグラフでも、グラフの点をドラッグしていろいろ形を変えてみてください。このアルゴリズムでは、あらかじめ中心や半径が分かっている二つの円から、それらに接する円の中心や半径を求めます。どの円から求めていくかによって、描かれる絵は全く違ったものになります。このアプレットでは、元のグラフの真ん中にあるものから優先的に円を求めていくようになっています。そのため、辺同士を交わらせたり、一つだけはずれた所に点を持ってきたりすると、おかしなものが出来るかもしれません。(円が一つしかないなど。)逆に、そのようにならないようにグラフを作れば、結構きれいに出来ると思います。



ソース
 
CPApp.java
CPGraph.java
NodeArray.java
Node.java
EdgeArray.java
Edge.java
GCanvas.java
RCanvas.java
Complex.java

まとめてダウンロード

戻る