如何在MATLAB中从现有的三角剖分中创建delaunayTriangulation对象

时间:2015-01-06 11:18:06

标签: matlab triangulation delaunay

我有一个现有的三角测量(顶点xy以及连通矩阵tri),我想应用PointLocation的{​​{1}}方法这个现有三角剖分的类(很像旧版MATLAB中过时的delaunayTriangulation函数)。

但是,tsearch方法显然需要PointLocation个实例作为输入。 delaunayTriangulation类似乎总是执行自己的三角测量过程,这会产生与我现有的delaunayTriangulation矩阵不同的连通矩阵,给定顶点trix

有没有办法将y(或像PointLocation这样的东西)应用到我现有的三角测量中?我有Matlab 2013a。

2 个答案:

答案 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三角测量的查询,尽管我最初的经验似乎表明这个新的内置函数可能会非常慢三角测量不是德劳内...