LoginSignup
5
2

More than 3 years have passed since last update.

MATLABでvoronoi図のデータ形式を確認してみる

Posted at

本稿の目的と出力

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

MATLABでボロノイ図が簡単に描けるので便利.

MATLAB でボロノイ図を描くのはとても簡単です.変数xyに母点の座標を入れ,

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))で描画した図はこちら.

voronoiSampleOrg.png

再構成した図はこちら.
voronoiSampleCopy.png

ボロノイ図を動的に変化させたい場合は,vrnObj(1), vrnObj(2)それぞれのXDataYDataを適切に変更すればMATLAB側で勝手に描画をし直してくれます.これを利用すると,こんなアニメーションも作れます.

testAnimated.gif

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2