function [flag] = InsectTriPatch(T1,T2)
% 判断两个空间三角形面片是否相交
% T1=[0 0 0;
% 2 0 0;
% 0 1.5 0;
% 0 0 1];
% T2=[0 0 -1;
% 2 0 -1;
% 0 2 -1;
% 0 0 1]; % 出自:《空间三角面片对相交判断算法》
% T=[A;B;C;n]
% A=[x y z]
A1=T1(1,:); % A1点的坐标:[x y z]
B1=T1(2,:);
C1=T1(3,:);
n1=T1(4,:); A2=T2(1,:);
B2=T2(2,:);
C2=T2(3,:);
n2=T2(4,:); %判断T2的3个顶点是否在平面π1 同侧
A1A2=A2-A1;
A1B2=B2-A1;
A1C2=C2-A1;
temp1=[dot(A1A2,n1) dot(A1B2,n1) dot(A1C2,n1)];
%判断T1的3个顶点是否在平面π2同侧
A2A1=A1-A2;
A2B1=B1-A2;
A2C1=C1-A2;
temp2=[dot(A2A1,n2) dot(A2B1,n2) dot(A2C1,n2) ]; % 判断temp1 或 temp2 是否同号
if any([all(temp1<0) all(temp1>0) all(temp2<0) all(temp2>0)])
% T1,T2 不相交,return 0
flag=0;
return
else
if all([isequal(cross(n1,n2),[0 0 0]),isequal(temp1,[0 0 0])])
% T1和 T2共面
if DetectVertexInTri(T1,T2)
% 存在T1的顶点在T2内部或者存在T2的顶点在T1内部,判定T1、T2相交, 返回真
flag=1;
return
else
if DetectVertex(T1,T2)
flag=1;
return
else
flag=0;
return
end
end
else
% T1 T2异面
if any([EdgeInsectTri(T1,T2) EdgeInsectTri(T2,T1)])
%存在 T2 边与 T1 相交或存在 T1 的边与 T2相交
flag=1;
return
else
flag=0;
return
end
end
end
end function is_in= PointInTri(T1,P)
% 函数实现: 判断一点是否在三角形T1内
% T=[A;B;C;n]
% A=[x y z]
A1=T1(1,:); % A1点的坐标:[x y z]
B1=T1(2,:);
C1=T1(3,:);
n1=T1(4,:); A1B1=B1-A1;
A1C1=C1-A1;
B1C1=C1-B1;
B1A1=A1-B1;
C1A1=A1-C1;
C1B1=B1-C1; A1P=P-A1;
B1P=p-B1;
C1P=P-C1; k1=dot(dot(A1P,cross(A1B1,n1)),dot(A1C1,cross(A1B1,n1)));
k2=dot(dot(B1P,cross(B1C1,n1)),dot(B1A1,cross(B1C1,n1)));
k3=dot(dot(C1P,cross(C1A1,n1)),dot(C1B1,cross(C1A1,n1))); if any([k1 k2 k3]<0)
% k1 k2 k3 存在负值,则P不在T1中
is_in=0;
return
else
is_in=1;
end
end function flag = DetectVertexInTri(T1,T2)
% 比较:存在T1 的顶点在 T2 内部或者存在 T2 的顶点在T1 内部?
% loop T1
for i=1:3
if PointInTri(T2,T1(i,:))
% 说明T1的顶点在T2内部,T1,T2 相交,return 1
flag=1;
return
end
end
% loop T2
for i=1:3
if PointInTri(T1,T2(i,:))
% 说明T2的顶点在T1内部,T1,T2 相交,return 1
flag=1;
return
end
end
end function flag=fun2(T2,p1,p2,n) A2=T2(1,:);
B2=T2(2,:);
C2=T2(3,:); h1=dot(A2-p1,cross(p2-p1,n));
h2=dot(B2-p1,cross(p2-p1,n));
h3=dot(C2-p1,cross(p2-p1,n));
temp=[h1 h2 h3];
if any([all(temp<0) all(temp>0)])
flag=0;
else
flag=1;
end
end function flag=DetectVertex(T1,T2)
% 共面-步骤二
% T=[A;B;C;n]
% A=[x y z]
% A1点的坐标:[x y z]
n1=T1(4,:);
n2=T2(4,:); index=[1 2;2 3;3 1];
% T2的3个顶点
for i=1:3
if fun2(T2,T1(index(i,1),:),T1(index(i,2),:),n1)
flag=1;
else
%有一条边不符合要求,直接返回0,不相交。
flag=0;
return
end
end
% T1的3个顶点
for i=1:3
if fun2(T1,T2(index(i,1),:),T2(index(i,2),:),n2)
flag=1;
else
%有一条边不符合要求,直接返回0,不相交。
flag=0;
return
end
end
flag=1;
end function flag= EdgeInsectTri(T1,T2)
% 函数实现:判断T2的线段A2B2 B2C2 C2A2是否与三角面片T1相交
index=[1 2;2 3;3 1];
tf=0;
for i=1:3
if fun3(T2(index(i,1),:),T2(index(i,2),:),T1)
% 存在线段和面片相交
flag=1;
return
else
tf=0;
end
end
flag=tf;
end function flag=fun3(p1,p2,T1)
% 实现:判断边p1p2是否与T1相交
% T=[A;B;C;n]
% A=[x y z]
A1=T1(1,:); % A1点的坐标:[x y z]
B1=T1(2,:);
C1=T1(3,:);
n1=T1(4,:); s1=cross(p1-A1,n1);
s2=cross(p2-A1,n1); if all([s1==[0 0 0] s2==[0 0 0]])
% p1p2和T1共面
if any([PointInTri(T1,p1) PointInTri(T1,p2)])
% p1 p2,至少一个点在三角形T1中,则p1p2和T1相交
flag=1;
return
else
flag=0;
return
end
else
% p1p2和T1异面
if dot(s1,s2)>0
% P1P2在T1同侧, 判定不相交;
flag=0;
return
else
g1=dot(dot(p2-A1,cross(B1-A1,p1-A1)),dot(C1-A1,cross(B1-A1,p1-A1)));
g2=dot(dot(p2-B1,cross(C1-B1,p1-B1)),dot(A1-B1,cross(C1-B1,p1-B1)));
g3=dot(dot(p2-C1,cross(A1-C1,p1-C1)),dot(B1-C1,cross(A1-C1,p1-C1))); if all([g1>0 g2>0 g3>0])
% g1 g2 g3 的计算结果均为非负,p1p2和T1相交
flag=1;
return
elseif any([g1<0 g2<0 g3<0])
% g1 g2 g3 的计算结果存在负值,p1p2和T1不相交
flag=0;
return
end
end
end
end

测试代码:

T1=[71.9139   48.8001   56.5830 ;
62.3056 73.4288 70.6124;
52.5847 7.1895 57.6345;
]; T2=[93.0718 68.6186 21.6408 ;
27.4472 1.6631 85.5462 ;
6.2035 83.9585 95.9391];
% plot triangles
v=[T1;T2];
f = [1 2 3;
4 5 6];
patch('Faces', f, 'Vertices', v, 'FaceVertexCData',[1; 0] ,'FaceColor', 'flat'); % caculate norm vector
n1=cross(T1(2,:)-T1(1,:),T1(3,:)-T1(1,:));
n1=n1/norm(n1);
T10=[T1;n1]; n2=cross(T2(2,:)-T2(1,:),T2(3,:)-T2(1,:));
n2=n2/norm(n2);
T20=[T2;n2]; tic
InsectTriPatch(T10,T20)
toc



《空间三角面片对相交判断算法》的matlab实现_ 0.2微秒的更多相关文章

  1. POJ 1039 Pipe(直线和线段相交判断,求交点)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8280   Accepted: 2483 Description ...

  2. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  3. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  4. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  5. KFCM算法的matlab程序

    KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...

  6. FCM算法的matlab程序2

    FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...

  7. FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  8. K-means算法的matlab程序

    K-means算法的matlab程序 在“K-means算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 ...

  9. FCM算法的matlab程序(初步)

    FCM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648430.html文章中已经介绍了FCM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  10. K-means算法的matlab程序(初步)

    K-means算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648369.html 文章中已经介绍了K-means算法,现在用matlab程序实现 ...

随机推荐

  1. MySQL的 安装、配置、卸载

    Mysql的安装配置(基于Centos7) 安装mysql数据库 [root@master ~]# wget https://dev.mysql.com/get/mysql57-community-r ...

  2. Spring完全注解开发

    注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中.用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配 ...

  3. [SQL]null值被比较的结果问题

    场景还原 有一个字段是 已删除 deleted 如果0 则是未删除 如果1 则是已删除 我写的where条件是 deleted != 1 然后数据库里面这个字段的值都是null 我当时就想,null值 ...

  4. Qt音视频开发33-vlc和mpv打开后鼠标打圈圈问题的解决

    一.前言 如果采用的vlc句柄模式,如果鼠标停留在句柄控件中会发现在打开后鼠标打圈圈,mpv句柄模式是在关闭后鼠标打圈圈,这两者真是一前一后,这种给人的体验其实很不友好的,播放开始后或者播放完成后鼠标 ...

  5. Qt编写安防视频监控系统44-视频上传

    一.前言 视频上传用来将本地存储的视频文件上传到云端服务器,间接的实现了本地视频存储到云端的功能,其实本质上是先存储在本地,文件生成后再去上传到云端的,最终的效果一样就是,为了拓展兼容性,直接做了单独 ...

  6. UML之模型、包及包的版型(构造型)

    包是UML模型的组织结构,也是UML项目的配置管理结构.包存在多个层级,除了顶层包,所有包隶属于一个且仅隶属于一个上层包.在项目不同阶段实际推进与配置过程中,通常以不同层级的包为单位进行check-i ...

  7. CSP-2024 初赛游记

    啊. \(\texttt{day}\) \(-4000\) 到重庆( \(\texttt{day}\) $ -3999$ ~ \(-7\) 文化课.文化课.OI.OI.自习.自习.模拟.模拟.挂分.挂 ...

  8. Cesium中3DTiles使用CustomShader着色器渲染

    加载模型 新版本cesium加载3DTiles代码如下,后续效果只修改CustomShader内内容 //加载楼栋白膜 let tileset try { tileset = await Cesium ...

  9. jdk 5.0 新增的foreach循环(用于遍历集合、数组)

    使用 foreach 循环遍历集合元素 Java 5.0 提供了 foreach 循环迭代访问 Collection和数组. 遍历操作不需获取Collection或数组的长度,无需使用索引访问元素 ...

  10. 一组开源、免费、Metro风格的 WPF UI 控件库 - MahApps.Metro

    前言 今天大姚给大家分享一个开源.免费.Metro风格的 WPF UI 控件库:MahApps.Metro. 项目介绍 MahApps.Metro 是一个开源.免费.Metro风格的 WPF UI 控 ...