本稿の目的と出力
このような,動的に変化するボロノイ図のアニメーションを作成するための準備について記します.

MATLABでボロノイ図が簡単に描けるので便利.
MATLAB でボロノイ図を描くのはとても簡単です.変数xとyに母点の座標を入れ,
MATLAB
vonoroi(x,y)
を実行するだけです.しかし,内容を動的に更新してアニメーションを作成したい場合などは,描画されている点や線のデータ形式を確認する必要があります.この記事ではそれを行います.
ボロノイ図を描いて描画用のデータを確認するソースコード
MATLAB
numOfPoints=5;
rng(1);
pos=(rand(numOfPoints,2)-0.5)*0.5+0.5;
figure
vrnObj=voronoi(pos(:,1),pos(:,2));
axOrg=[get(gca,'xlim') get(gca,'ylim')];
vrnObj
[vrnObj(1).XData; vrnObj(1).YData]
[vrnObj(2).XData; vrnObj(2).YData]
[vx,vy]=voronoi(pos(:,1),pos(:,2));
vx
vy
vx=[vx;nan(1,size(vx,2))];
vx=reshape(vx,1, prod(size(vx)) );
vy=[vy;nan(1,size(vy,2))];
vy=reshape(vy,1, prod(size(vy)) );
figure(2)
hold on;
plot(pos(:,1),pos(:,2),'o');
plot(vx,vy,'r--');
axis(axOrg);
ソースコード解説
以下,ソースコードの解説です.
-
vrnObj=voronoi(pos(:,1),pos(:,2));ボロノイ図を描き,その内容をvrnObjという変数に代入しています.vrnObjは二つのLineを含んでいることが分かるので,その内容を出力してみます. - すると,
vrnObj(1)は母点,vrnObj(2)はボロノイセルの境界線を示していることが分かります.-
nanを含んだデータをplotすると,nanを自動で飛ばしてくれる,という仕様がいい感じで効いています. -
vrnObj(2).XDataは1行のベクトルで,「境界線の始点 境界線の終点 nan」の繰り返しで構成されているようです.
-
- マニュアルを読むと,
[vx,vy]=voronoi(pos(:,1),pos(:,2))の形式でボロノイセルの頂点の情報を出してくれるようなので,使って内容を確認してみます.- すると,
vxは2行の配列で,各列に一つの境界線の始点と終点のx座標が記録されていることが分かります. - したがって,このデータに
nanを挟んで1列に並び替えればvrnObj(2).XDataと同じ形式になりそうです.これをそのまま行うため,reshape関数を使います.
- すると,
- データの準備が終わったら,新しい
figureに母点とボロノイセルを描画します.わかりやすいように,マーカや色の設定を変えました.
出力
voronoi(pos(:,1),pos(:,2))で描画した図はこちら.
ボロノイ図を動的に変化させたい場合は,vrnObj(1), vrnObj(2)それぞれのXDataとYDataを適切に変更すればMATLAB側で勝手に描画をし直してくれます.これを利用すると,こんなアニメーションも作れます.


