在重叠范围内找到点

时间:2015-06-15 16:33:46

标签: matlab matlab-figure

我有中心坐标和多个球面(空心)的半径。这些球体可以具有不同的半径,并且一些球体将重叠。每当它们重叠时,我想消除沿着另一个球体内或重叠的任何球体表面上的点,这样我就可以得到“外部”视图。

我如何寻找/消除这些重叠点?是否存在用于查找这些点的现有算法?

提前致谢,如果我能更好地澄清这个问题,请告诉我!

修改1:

输入将是LAMMPS输出文件。重要部分如下。第一列是原子id,以便原子可以区分。接下来的3个是x,y,z坐标。半径由用户输入给出。

ATOMS_id     x       y       z  
________    ____    ____    ____

 1             0       0       0
 2          1.76    1.76       0
 3          1.76       0    1.76
 4             0    1.76    1.76
 5          3.52       0       0
 6          3.52    1.76    1.76
 7             0    3.52       0
 8          1.76    3.52    1.76
 9          3.52    3.52       0
10             0       0    3.52
11          1.76    1.76    3.52
12          3.52       0    3.52
13             0    3.52    3.52
14          3.52    3.52    3.52

使用上述点和半径1.6,这是我当前代码的输出(仅生成图像)。

Sample Output

主要问题是我的代码(使用sphere(n)surf()函数)绘制了球体的所有部分,无论这些点是否重叠。我想基本上只得到构成上图的外表面的坐标,而没有内部部件。

Simple Example

如上所述,更简单的情况是只有两个领域。

2 个答案:

答案 0 :(得分:1)

基于这两个来源,我已经设法为2球案例提出了一些概念验证算法:src1src2

%% // Init
clear variables; close all force; clc;
%% // Generate spheres
[X,Y,Z] = sphere(40);
P{1} = unique([X(:),Y(:),Z(:)],'rows');
P{2} = bsxfun(@plus,P{1},[0.75,0,0]);
%% // Generate triangulations
DT{1} = delaunayTriangulation(P{1});
DT{2} = delaunayTriangulation(P{2});
%% // Find points within the other triangulation
isIn1 = ~isnan(tsearchn(P{1}, DT{1}.ConnectivityList, P{2})); 
isIn2 = ~isnan(tsearchn(P{2}, DT{2}.ConnectivityList, P{1})); 
%% // Plotting
newP = [P{1}(~isIn2,:);P{2}(~isIn1,:)];
%// Before:
figure();
surf(X,Y,Z); hold on; surf(X+0.75,Y,Z);
xlabel('x'); ylabel('y'); zlabel('z');
ylim([0,1]);
%// After:
figure();
scatter3(newP(:,1),newP(:,2),newP(:,3));
ylim([0,1]);

结果如下:

  • 之前:

enter image description here

  • 后:

enter image description here

联合卷内仍然存在一些错误点,但我认为情况要比开始时好得多。

注意:This FEX submission可能对您有用。

答案 1 :(得分:0)

你可以找到距离半径相对于eah球体中心的点,并且在网格三角化之后消除三角形,其中点在另一个球体内。

相关问题