我有中心坐标和多个球面(空心)的半径。这些球体可以具有不同的半径,并且一些球体将重叠。每当它们重叠时,我想消除沿着另一个球体内或重叠的任何球体表面上的点,这样我就可以得到“外部”视图。
我如何寻找/消除这些重叠点?是否存在用于查找这些点的现有算法?
提前致谢,如果我能更好地澄清这个问题,请告诉我!
修改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,这是我当前代码的输出(仅生成图像)。
主要问题是我的代码(使用sphere(n)
和surf()
函数)绘制了球体的所有部分,无论这些点是否重叠。我想基本上只得到构成上图的外表面的坐标,而没有内部部件。
如上所述,更简单的情况是只有两个领域。
答案 0 :(得分:1)
基于这两个来源,我已经设法为2球案例提出了一些概念验证算法:src1,src2。
%% // 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]);
结果如下:
联合卷内仍然存在一些错误点,但我认为情况要比开始时好得多。
注意:This FEX submission可能对您有用。
答案 1 :(得分:0)
你可以找到距离半径相对于eah球体中心的点,并且在网格三角化之后消除三角形,其中点在另一个球体内。