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

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

 채택된 답변

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!