30.1.2三角剖分中的点识别

通常需要确定N维空间中的特定点是否在该N维空间的一组点的Delaunay镶嵌内,如果是,则N-单纯形中包含该点,以及镶嵌中的哪个点最接近所需点。函数tsearch在三角剖分中执行此函数,tsearchndsearchn在N维镶嵌中执行此函数。

识别是否从向量表示的特定点p落在N-单纯形的一个单纯形内,我们可以把点的笛卡尔坐标写成关于N-单纯形的参数形式。这种参数形式称为点的重心坐标。如果从给定N+1个向量t(i,:)定义N-单纯形的点,则定义该点的重心坐标p从下面的式子给定

p = beta * t

这里的beta包含N+1个值,这些值一起作为向量表示点的重心坐标p。要确保beta的值具有唯一的解决方案,就额外需要下面的条件

sum (beta) == 1

这是强制的,因此我们可以将上述内容写成

p - t(end, :) = beta(1:end-1) * (t(1:end-1, :)
                - ones (N, 1) * t(end, :)

要解决beta,可以这样写

beta(1:end-1) = (p - t(end, :)) /
                (t(1:end-1, :) - ones (N, 1) * t(end, :))
beta(end) = sum (beta(1:end-1))

它给出了笛卡尔坐标的转换公式,从点p到重心坐标beta.重心坐标的一个重要性质是,对于N-单纯形中的所有点,满足

0 <= beta(i) <= 1

因此,tsearchtsearchn中的测试本质上需要用N-单纯形的每个单纯形的重心坐标来表示每个点,并测试beta的值。这正是tsearchn中使用的实现. tsearch针对二维进行了优化,并且没有明确形成重心坐标。

 
: idx = tsearch (x, y, t, xi, yi)

搜索封闭的Delaunay凸包。

对于t = delaunay (x, y),在t中查找包含点(xi, yi)的索引。对于凸壳外部的点,idx是NaN。

注意:此算法是O(M*N)复杂度,用于 在 M 个三角形中定位N 个点. 如果点在简单的连续路径中,那么性能更快; 父区域的范围之内的点被最先检查, 在连续路径中可以加速查找.

详见: delaunay, delaunayn.

广告
 
: idx = tsearchn (x, t, xi)
: [idx, p] = tsearchn (x, t, xi)

找到包围给定点的单纯形。

tsearchn通常与delaunayn一起使用:t = delaunayn (x)返回一组单纯形t,然后tsearchn返回t的行索引,包含每个xi点对于凸包外部的点,idx是NaN。

如果被指定,tsearchn还返回重心坐标p封闭单纯形的。

详见: tsearch, dsearchn, delaunayn.

广告

tsearch的使用示例可以用简单的三角剖分法看到

x = [-1; -1; 1; 1];
y = [-1; 1; -1; 1];
tri = [1, 2, 3; 2, 3, 4];

由两个三角形组成,定义为tri.然后我们可以确定一个点落在哪个三角形里

tsearch (x, y, tri, -0.5, -0.5)
⇒ 1
tsearch (x, y, tri, 0.5, 0.5)
⇒ 2

我们可以确认一个点不在其中一个三角形内,就像

tsearch (x, y, tri, 2, 2)
⇒ NaN

这里的dsearchn在测试中找到离所需点最近的点。所需的点不一定必须在镶嵌中,即使它是镶嵌的返回点,也不一定是在其中找到所需点的N-单纯形的顶点之一。

 
: idx = dsearchn (x, tri, xi)
: idx = dsearchn (x, tri, xi, outval)
: idx = dsearchn (x, xi)
: [idx, d] = dsearchn (…)

返回索引idx到元素xi的最近点x.

如果指定outval的值,则在xi不包含在单纯形tri中时设置为outval。通常tridelaunayn (x)返回.

可选输出d包含从列向量xi到最近的单纯形点x之间的距离.

兼容性注意: dsearchn算法只使用输入的 tri ,如果outdim被指定用于是否任意点在三角区域之外。 为了兼容性,tri被接受作为输入,即使没有指定outdim, 但它不会被使用或检查为有效的三角剖分,并且提供它不会影响输出idx或计算效率。

详见: tsearchn, delaunayn.

广告

dsearchn的使用示例,使用上述值x, ytri如下:

dsearchn ([x, y], tri, [-2, -2])
⇒ 1

如果希望搜索符号镶嵌之外的点,则dsearchn的用例如下:

dsearchn ([x, y], tri, [-2, -2], NaN)
⇒ NaN
dsearchn ([x, y], tri, [-0.5, -0.5], NaN)
⇒ 1

其中在镶嵌之外的点为NaN.


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2