本稿の目的と出力
このような,動的に変化するボロノイ図のアニメーションを作成するための準備について記します.
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側で勝手に描画をし直してくれます.これを利用すると,こんなアニメーションも作れます.