Matlab 用点测试法求两个四面体的交点

Matlab 用点测试法求两个四面体的交点,matlab,geometry,computational-geometry,tetrahedra,Matlab,Geometry,Computational Geometry,Tetrahedra,我不熟悉Matlab编程。我使用EIDORS和Netgen创建了两个四面体网格模型。然后,我需要使用Matlab根据四面体元素之间的交点创建一个贴图。因此,为了找到交点,我尝试使用点测试方法。请参考链接。 让我们假设模型1和模型2 首先,我从两个模型和创建的矩阵中提取顶点 然后,我使用点测试方法来计算模型之间的交点 对于模型1,我有3000++四面体元素,而模型2,我有8000++四面体元素 为了计算交集,我逐个循环以确定两个模型之间的哪些元素具有交集,然后通过将model2的元素编号索引到m

我不熟悉Matlab编程。我使用EIDORS和Netgen创建了两个四面体网格模型。然后,我需要使用Matlab根据四面体元素之间的交点创建一个贴图。因此,为了找到交点,我尝试使用点测试方法。请参考链接。

让我们假设模型1和模型2

首先,我从两个模型和创建的矩阵中提取顶点

然后,我使用点测试方法来计算模型之间的交点

对于模型1,我有3000++四面体元素,而模型2,我有8000++四面体元素

为了计算交集,我逐个循环以确定两个模型之间的哪些元素具有交集,然后通过将model2的元素编号索引到model1的元素编号来创建一个矩阵

但是,少数元素似乎为零,这是不可能的,因为model1中的所有元素至少应与model2中的少数元素相交

因此,最终我希望得到一个矩阵(model1的元素数x model2的元素数,它与model1中相应的元素相交)。你能帮我解决这个问题吗?请参考我的代码

function [elemno,deter0,deter1,deter2,deter3,deter4] = checkp(filename1,filename2);

%/* to check whether the vertices of a layered model''s element are inside the
% tetrahedron of the generic model
%after the model is created using netgen and eidors, there will be a struct    type 
%named model_parameters.
%model_parameters.vtx refers to the vertices which consists of (nodes x   vertices %(x,y,z))
%model_parameters.simp refers to the elements which consists (numberofelements x nodes) nodes are linked to the vertices.*/

filename1 = [filename1 '.mat'];
filename2 =[filename2 '.mat'];

first = load(filename1);
second =load(filename2);

vtx = first.model_parameters.vtx;
simp = first.model_parameters.simp;
[simpr,simpc] = size(simp);

vtx2 = second.model_parameters.vtx;
simp2= second.model_parameters.simp;
[simpr2,simpc2] = size(simp2);


%//extracting the vertices of the elements from the simplices(element)
for loop1 = 1 : simpr
    elemx(loop1,1) = vtx(simp(loop1,1),1);      
    elemx(loop1,2) = vtx(simp(loop1,2),1);
    elemx(loop1,3) = vtx(simp(loop1,3),1);
    elemx(loop1,4) = vtx(simp(loop1,4),1);

    elemy(loop1,1) = vtx(simp(loop1,1),2);
    elemy(loop1,2) = vtx(simp(loop1,2),2);
    elemy(loop1,3) = vtx(simp(loop1,3),2);
    elemy(loop1,4) = vtx(simp(loop1,4),2);

    elemz(loop1,1) = vtx(simp(loop1,1),3);
    elemz(loop1,2) = vtx(simp(loop1,2),3);
    elemz(loop1,3) = vtx(simp(loop1,3),3);
    elemz(loop1,4) = vtx(simp(loop1,4),3);

end

for loop2 = 1:simpr2
    elemx2(loop2,1) = vtx2(simp2(loop2,1),1);
    elemx2(loop2,2) = vtx2(simp2(loop2,2),1);
    elemx2(loop2,3) = vtx2(simp2(loop2,3),1);
    elemx2(loop2,4) = vtx2(simp2(loop2,4),1);

    elemy2(loop2,1) = vtx2(simp2(loop2,1),2);
    elemy2(loop2,2) = vtx2(simp2(loop2,2),2);
    elemy2(loop2,3) = vtx2(simp2(loop2,3),2);
    elemy2(loop2,4) = vtx2(simp2(loop2,4),2);

    elemz2(loop2,1) = vtx2(simp2(loop2,1),3);
    elemz2(loop2,2) = vtx2(simp2(loop2,2),3);
    elemz2(loop2,3) = vtx2(simp2(loop2,3),3);
    elemz2(loop2,4) = vtx2(simp2(loop2,4),3);

end
%//point test calculation
r =[1;1;1;1];
for a = 1:simpr
    m=1;
    for b=1:simpr2  
        for n = 1:4
            p = [elemx2(b,n),elemy2(b,n),elemz2(b,n)];
            n1=[elemx(a,1),elemy(a,1),elemz(a,1)];
            n2=[elemx(a,2),elemy(a,2),elemz(a,2)];
            n3=[elemx(a,3),elemy(a,3),elemz(a,3)];
            n4=[elemx(a,4),elemy(a,4),elemz(a,4)];
            d0 =[n1;n2;n3;n4];
            d0 =[d0 r];
            d1 =[p;n2;n3;n4];
            d1 =[d1 r];
            d2 =[n1;p;n3;n4];
            d2 =[d2 r];
            d3 =[n1;n2;p;n4];
            d3 =[d3 r];
            d4 =[n1;n2;n3;p];
            d4 =[d4 r];
            deter0 = sign(det(d0));
            deter1 = sign(det(d1));
            deter2 = sign(det(d2));
            deter3 = sign(det(d3));
            deter4 = sign(det(d4));
            if isequal(deter0,deter1,deter2,deter3,deter4)
                elemno(a,m) = b;   
                m=m+1;
                break;
            else
                continue;
            end
        end
    end
end

请注意,两个四面体的所有顶点都可能位于彼此之外,但这些四面体确实相交,因此点测试不是可靠的方法

可能的稳健和快速的方法是


我已经使用2D版本在包含大量(10^4和10^6)凸多边形的两个集合之间快速选择相交对,但3D版本看起来也足够简单。

请注意,两个四面体的所有顶点都可能位于彼此之外,但这些四面体确实相交,因此,点测试不是可靠的方法

可能的稳健和快速的方法是


我使用2D版本快速选择了两个包含大量(10^4和10^6)凸多边形的集合之间的相交对,但3D版本看起来也很简单。

感谢您的回复。我理解你提到的点测试不可靠。然而,我不认为我真的理解你发布的方法中的方向D。我在处理网格,我不确定所有四面体元素的方向都是D,我不知道网格的结构。但对于这种方法,必须为每个面使用正确排序的顶点,才能知道哪一侧(法线)向外。确定四面体的正确方向并不难——只要得到一些内点M(例如,所有顶点的平均值),并检查法线和MX向量的标量积的符号就足够了,其中X是给定面的任何垂直。若符号是负数,那个就逆法线。我对几何学不是很熟悉。如果可能的话,你能给我举一个应用分离轴方法的例子吗?我很难理解伪代码。提前谢谢。对不起,我没有3D方面的经验,也不懂matlab。本文的作者EbByl维护C++库,包含需要的数据结构和代码,如果它能帮助您:没关系。至少我学到了一些新东西。我将尝试理解分离轴方法,看看是否能很好地使用它。非常感谢。谢谢你的回复。我理解你提到的点测试不可靠。然而,我不认为我真的理解你发布的方法中的方向D。我在处理网格,我不确定所有四面体元素的方向都是D,我不知道网格的结构。但对于这种方法,必须为每个面使用正确排序的顶点,才能知道哪一侧(法线)向外。确定四面体的正确方向并不难——只要得到一些内点M(例如,所有顶点的平均值),并检查法线和MX向量的标量积的符号就足够了,其中X是给定面的任何垂直。若符号是负数,那个就逆法线。我对几何学不是很熟悉。如果可能的话,你能给我举一个应用分离轴方法的例子吗?我很难理解伪代码。提前谢谢。对不起,我没有3D方面的经验,也不懂matlab。本文的作者EbByl维护C++库,包含需要的数据结构和代码,如果它能帮助您:没关系。至少我学到了一些新东西。我将尝试理解分离轴方法,看看是否能很好地使用它。非常感谢你。