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

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

 採用された回答

Tohru Kikawada
Tohru Kikawada 2019 年 1 月 25 日
編集済み: Tohru Kikawada 2019 年 1 月 25 日

0 投票

下記のようなイメージでしょうか。
%% ボロノイ図の作成
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 件のコメント

yusuke kobayashi
yusuke kobayashi 2019 年 1 月 25 日
回答有り難うございます。とてもわかり易く、簡単に交点が求められました。
この交点なんですが、可能であれば各母点に紐づけたいんですが、可能でしょうか?
というのも、領域を区分けしたあと、個々の領域について再度計算を実行しようと思っていて、
それには個々の領域の形状を座標として入力したいのです
Tohru Kikawada
Tohru Kikawada 2019 年 1 月 25 日
はい、できると思います。こんな時はドキュメントを確認してみるとよいです。
例えば関数 voronoi のドキュメントを下記のように参照してみてください。
>> doc voronoi
すると下記の記述が見つかります。
セルを色で塗りつぶす場合は、各セルのインデックスを得るために n = 2 で voronoin を使用してから関数 patch と Figure を作成するプロット関数を使用してください。patch は、閉じられていないセルを塗りつぶせないことにご注意ください。
各セルのインデックスとありますので、各領域がどの頂点で構成されているか確認することができます。
その情報を組み合わせれば元の母点との対応付けもできると思います。
yusuke kobayashi
yusuke kobayashi 2019 年 1 月 25 日
なるほど、確かに当該箇所を読めば実装できそうです。
領域の角の点も分割後の領域の座標に含まれますが、同様にすれば紐づけできるのでしょうか?
度々の質問で申し訳ありません。untitled.jpg
Tohru Kikawada
Tohru Kikawada 2019 年 1 月 25 日
なるほど、交点というよりも各領域を出されたかったんですね。それでしたら、各辺の交点を求めるよりも、各領域と正方形の和集合を求めるほうが近道だと思います。
  1. voronoin でそれぞれの領域の頂点のリストを作る
  2. 各領域の頂点をpolyshape でオブジェクト化
  3. intersect で正方形と各領域の和集合をとる
トライしてみてください。
yusuke kobayashi
yusuke kobayashi 2019 年 1 月 26 日
編集済み: yusuke kobayashi 2019 年 1 月 26 日
その方法をやってみようと思って、下のように書いてはみたのですが、
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     

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File Exchangeボロノイ線図 についてさらに検索

Community Treasure Hunt

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

Start Hunting!