我有一个现有的三角测量(顶点x
和y
以及连通矩阵tri
),我想应用PointLocation
的{{1}}方法这个现有三角剖分的类(很像旧版MATLAB中过时的delaunayTriangulation
函数)。
但是,tsearch
方法显然需要PointLocation
个实例作为输入。 delaunayTriangulation
类似乎总是执行自己的三角测量过程,这会产生与我现有的delaunayTriangulation
矩阵不同的连通矩阵,给定顶点tri
和x
。
有没有办法将y
(或像PointLocation
这样的东西)应用到我现有的三角测量中?我有Matlab 2013a。
答案 0 :(得分:2)
将triangulation
变为delaunayTriangulation
:
triangulation
,因为它们不符合Delaunay属性。trep
行为良好,但可能会添加其他三角形和随机播放节点,则受约束的Delaunay三角剖分可能有效:
delaunayTriangulation(trep.Points, trep.edges);
因此我建议你以下
您可以使用triangulation
类:
trep = triangulation(tri, x, y);
QPs = rand(10,2); % Query points.
TI = pointLocation(trep, QPs);
使用自制函数pointLocation
:
function TI = pointLocation(trep, QPs)
% Find query point QPs in triangulation trep
TI = cell(size(QPs,1), 1);
for i = 1:size(QPs,1)
barys = trep.cartesianToBarycentric((1:size(trep,1))', repmat(QPs(i,:),size(trep,1),1));
TI{i} = find(all((0<=barys)&(barys<=1),2));
end
请注意TI
是一个单元格数组,对于三角剖分,人们不能确定它们在某种意义上是规则的,只有一个包含该点的三角形/四面体。这种方法的工作方式是计算查询点相对于所有三角形/四面体的重心坐标,然后使用这些坐标来检查点是否实际位于它们内部。 (如果所有重心坐标都在0<=bx,by,bz<=1
范围内,则会出现这种情况。)
答案 1 :(得分:1)
我不认为有一种简单的方法可以让MATLAB
内置的三角测量程序为你做这件事 - 正如你所说,他们明确要求三角测量是德洛奈...
但是,您可能有兴趣查看我的FINDTRIA
routines(可从MATLAB
文件交换中获取)。 FINDTRIA
是一个工具箱,用于对任意(d维)三角测量执行点位置查询,包括非Delaunay,非凸或甚至重叠的那些,因此它应该处理你的三角测量。
虽然没有MATLAB
的内置pointLocation
例程(当底层三角测量是Delaunay时)快,FINDTRIA
通常比做蛮力更有效率O(n*m)
搜索每个点/三角形对。 FINDTRIA
使用几何搜索树 - an AABB-tree - 来加速计算。
从R2014b
开始,MATLAB
也支持使用pointLocation
例程对非Delaunay三角测量的查询,尽管我最初的经验似乎表明这个新的内置函数可能会非常慢三角测量不是德劳内...