ボロノイ線図と特定のエリアの領域との交点

ボロノイ線図を利用して、領域を区分けしたいと思っています。
ある領域(ここでは正方形にしています)と、ボロノイ線図の交点を計算したいのですが、
やり方がわかりません。どなたか知っていませんか?

 Accepted Answer

Tohru Kikawada
Tohru Kikawada on 25 Jan 2019
Edited: Tohru Kikawada on 25 Jan 2019

0 votes

下記のようなイメージでしょうか。
%% ボロノイ図の作成
x = gallery('uniformdata',[1 10],0);
y = gallery('uniformdata',[1 10],1);
[vx,vy] = voronoi(x,y);
figure, plot(vx,vy,'b-')
axis equal;
axis([0 1 0 1]);
%% 正方形の領域定義
poly1 = polyshape([0.25 0.25 0.75 0.75],[0.75 0.25 0.25 0.75]);
hold on;
plot(poly1)
%% 正方形の辺とボロノイ図の辺の交点を検出
for k = 1:size(vx,2)
% 交点を検出
[in,out] = intersect(poly1,[vx(:,k) vy(:,k)]);
plot(in(:,1),in(:,2),'b',out(:,1),out(:,2),'r')
% 交点座標を抽出
if ~isempty(in) && ~isempty(out)
ind = ismember(in,out,'rows');
intxy = in(ind,:);
plot(intxy(1),intxy(2),'ro');
end
end

5 Comments

yusuke kobayashi
yusuke kobayashi on 25 Jan 2019
回答有り難うございます。とてもわかり易く、簡単に交点が求められました。
この交点なんですが、可能であれば各母点に紐づけたいんですが、可能でしょうか?
というのも、領域を区分けしたあと、個々の領域について再度計算を実行しようと思っていて、
それには個々の領域の形状を座標として入力したいのです
Tohru Kikawada
Tohru Kikawada on 25 Jan 2019
はい、できると思います。こんな時はドキュメントを確認してみるとよいです。
例えば関数 voronoi のドキュメントを下記のように参照してみてください。
>> doc voronoi
すると下記の記述が見つかります。
セルを色で塗りつぶす場合は、各セルのインデックスを得るために n = 2 で voronoin を使用してから関数 patch と Figure を作成するプロット関数を使用してください。patch は、閉じられていないセルを塗りつぶせないことにご注意ください。
各セルのインデックスとありますので、各領域がどの頂点で構成されているか確認することができます。
その情報を組み合わせれば元の母点との対応付けもできると思います。
yusuke kobayashi
yusuke kobayashi on 25 Jan 2019
なるほど、確かに当該箇所を読めば実装できそうです。
領域の角の点も分割後の領域の座標に含まれますが、同様にすれば紐づけできるのでしょうか?
度々の質問で申し訳ありません。untitled.jpg
Tohru Kikawada
Tohru Kikawada on 25 Jan 2019
なるほど、交点というよりも各領域を出されたかったんですね。それでしたら、各辺の交点を求めるよりも、各領域と正方形の和集合を求めるほうが近道だと思います。
  1. voronoin でそれぞれの領域の頂点のリストを作る
  2. 各領域の頂点をpolyshape でオブジェクト化
  3. intersect で正方形と各領域の和集合をとる
トライしてみてください。
yusuke kobayashi
yusuke kobayashi on 26 Jan 2019
Edited: yusuke kobayashi on 26 Jan 2019
その方法をやってみようと思って、下のように書いてはみたのですが、
polyshape は inf を扱えないと言われて跳ね返されてしまいます。
[v,c] = voronoin(X);
%外形の領域の定義
poly1 = polyshape([0 1 1 0],[0 0 1 1]);
hold on
for k = 1:size(X(:,1),2)
Region = [v(c{k},1),v(c{k},2)];
poly2 = polyshape(Region);
hold on
Overlap = intersect(poly1,poly2);
Area = polyshape(Overlap.Vertices);
plot(Area,'Facecolor','g')
end     

Sign in to comment.

More Answers (0)

Categories

Find more on ボロノイ線図 in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!