找出三角剖分边所有交点的有效方法?

2次查看(最近30天)
泰塔斯大脑
泰塔斯大脑 2021年1月22日
编辑: 马特·J 2021年1月23日
你好,
我有一个 三角测量 对象,它是一个顶点列表和连接列表,以创建形成三角形网格的边。我正在寻找一个有效的解决方案,以找到所有边之间的所有缺失的交点。在下面的图中,绿色的点是原始的顶点,红色的叉是我想找到的交点:
示例代码如下:
clc
Clearvars.
% 3x3 1内三角形
[xx, yy] = meshgrid(1:3, 1:3);
V = [[xx(:), yy(:)];1.5 - 1.75;2 2.5;2.5 - 1.75);
V(4,:) = [];
F = [1 2 4;2 3 5;2 4 5;4 6 7;4 5 7;5 7 8;9 10 11];
创建三角对象
tr =三角测量(F, V);
%的阴谋
图=图(298);
clf(图);
集(图,'颜色', [1 1 1],“WindowState”“正常”
ax =轴(图,'offormosition', [0 0 1 1],“剪裁”“关闭”'xlim'xx, xx(1) -0.1(结束)+ 0.1),“YLim”, (yy (1) -0.1 yy(结束)+ 0.1),“盒子”“上”...
“XGrid”“上”“XMinorGrid”“上”“YGrid”“上”“YMinorGrid”“上”'dataaspectratio', [1 1 1]);
p =补丁(ax,“脸”F“顶点”v,“FaceColor”, [0 0.5 1],'标记'“。”'markeredgecolor'‘g’'Markersize',18);
%查找并添加所有交叉点
警告(“这需要用函数/算法来代替”
SISTINGINTERSECTESS = [1.75 1.75;2.25 1.75;5/3 2;7/3 2];% <——这是一个“手动”解决方案
线(AX,MissingIntersections(:,1),MissingInterections(:,2),'linestyle'“没有”'标记'“x”'颜色'“r”“线宽”2,'Markersize', 16)
有什么功能可以有效地找到所有的交叉点吗?我可以循环遍历所有边并检查它是否与其他边相交但这将会非常缓慢我想有更有效的方法。实际的应用程序要大得多,因此循环太慢。
非常感谢,
泰坦巨人

接受的答案

马特·J
马特·J 2021年1月22日
编辑:马特·J 2021年1月23日
使用符号工具箱,容易导出用于两个边的闭合表格参数解决方案:
信谊XA XB XC XD YA YB YC YD S T
equ1 = (xa; ya) + s * [xb-xa; yb-ya];从[xa,ya]到[xb,yb]
equ2 = (xc; yc) + t * [xd-xc; yd-yc];从[xc,yc]到[xd,yd]的%边缘
索尔=解决(equ1 = = equ2 (s, t));
s = vectorize (sol.s)
S =”(xa。* yc -我。* ya - xa。*码+ xd。*你+我。*码- xd。* yc)。/ (xa。* yc -我。* ya - xa。*码—xb。* yc +我。* yb + xd。*丫+ xb。*码- xd。* yb)”
t = vectorize (sol.t)
t =' - (xa。* yb - xb。* ya-xa。* yc + xc。* ya + xb。* yc-xc。* yb)./(xa。* yc-xc。* ya-xa。* yd- XB。* YC + XC。* YB + XD。* YA + XB。* YD - XD。* YB)'
如您所见,这些表达式是非常可向量化的。如果你收集向量xa ya xb yb等等。对于顶点坐标,您可以在一个语句中计算所有边交点的s和t。当然,一个解(s,t)只对应于一个物理交集,如果 ,所以你将不得不做一些后处理,放弃非物理解决方案。金宝搏官方网站但这一步也是明显可向量化的。

更多的答案(0)

下载188bet金宝搏


释放

R2018B.

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!