3D座標のセットを取り、三角形分割を実行して凸包/ Delaunay を生成するコードを開発しました。
これはうまくいき、Deluanay 三角形分割を使用して、tsearchn を使用して特定のボリュームにポイントが含まれているかどうかをテストできます。
次に、そのような 3D ボリュームを 2 つ取り、それらが交差するかどうかをテストします。さらに、ボリューム A とボリューム B の何パーセントが交差しているかを知りたいです。
1 つのボリューム内にあるポイントのメッシュ グリッドを生成し、tsearchn を使用してそれらを別のボリュームにテストできると思います。しかし、もっと便利な方法を誰かが知っているかどうか知りたかったのです。または、同様の分析を行うためのアドバイスがあります。
どうもありがとう!
編集...コード例
このサンプル コードの場合、shapeA
は と 50% 交差しshapeB
ます。
コードの最後に、形状のポイント数を増やしてテストすることで問題を解決できることを
示すセクションを追加しました。tsearchn
tsearchn
% Establish shapes by coordinates
botA = [ 0 0 0 ; ...
1 0 0; ...
1 1 0; ...
0 1 0 ];
topA = botA; topA(:,3) = 1;
midA = [0.5 0.5 0.5];
botB = [ 0 0 0.5 ; ...
1 0 0.5; ...
1 1 0.5; ...
0 1 0.5 ];
topB = botA; topB(:,3) = 1.5;
midB = [0.5 0.5 1];
% Shape arrays
shapeA = [botA;midA;topA];
shapeB = [botB;midB;topB];
% Establish volume by using the delaunayn() function
dtA = delaunayn(shapeA);
dtB = delaunayn(shapeB);
% Plot the volume surfaces
shapesurfA=tetramesh(dtA,shapeA);
set(shapesurfA,'FaceColor','b','FaceAlpha',.90,'EdgeAlpha',1);
hold on
shapesurfB=tetramesh(dtB,shapeB);
set(shapesurfB,'FaceColor','y','FaceAlpha',.90,'EdgeAlpha',1);
hold off
axis equal
%example of point in volume test
%if tsearchn output = NaN then testpoint is not in volume
testpoint1 = tsearchn(shapeA,dtA, [ 2 2 2]) % [test point [2 2 2] in volume A
testpoint2 = tsearchn(shapeA,dtA, [0.75 0.75 0.75])