Delaunay#
- class scipy.spatial.Delaunay(points, furthest_site=False, incremental=False, qhull_options=None)#
N 维 Delaunay 剖分。
0.9 版本新增。
- 参数:
- points浮点型 ndarray,形状为 (npoints, ndim)
要进行三角剖分的点的坐标
- furthest_site布尔型,可选
是否计算最远点 Delaunay 三角剖分。默认值:False
0.12.0 版本新增。
- incremental布尔型,可选
允许增量添加新点。这会占用一些额外资源。
- qhull_options字符串型,可选
要传递给 Qhull 的其他选项。详见 Qhull 手册。选项 “Qt” 始终启用。默认值:ndim > 4 时为 “Qbb Qc Qz Qx Q12”,否则为 “Qbb Qc Qz Q12”。增量模式省略 “Qz”。
0.12.0 版本新增。
- 属性:
- points双精度型 ndarray,形状为 (npoints, ndim)
输入点的坐标。
- simplices整型 ndarray,形状为 (nsimplex, ndim+1)
构成三角剖分中单形的点的索引。对于二维,点按逆时针方向排列。
- neighbors整型 ndarray,形状为 (nsimplex, ndim+1)
每个单形邻居单形的索引。第 k 个邻居与第 k 个顶点相对。对于边界上的单形,-1 表示没有邻居。
- equations双精度型 ndarray,形状为 (nsimplex, ndim+2)
[法线,偏移量] 构成抛物面上刻面的超平面方程(更多信息请参见 Qhull 文档)。
- paraboloid_scale, paraboloid_shift浮点型
额外抛物面维度的缩放和偏移(更多信息请参见 Qhull 文档)。
transform
双精度型 ndarray,形状为 (nsimplex, ndim+1, ndim)从
x
到重心坐标c
的仿射变换。vertex_to_simplex
整型 ndarray,形状为 (npoints,)查找数组,从一个顶点到其所属的某个单形。
convex_hull
整型 ndarray,形状为 (nfaces, ndim)构成点集凸包的刻面的顶点。
- coplanar整型 ndarray,形状为 (ncoplanar, 3)
共面点的索引以及最近刻面和最近顶点的相应索引。共面点是指由于数值精度问题而未包含在三角剖分中的输入点。
如果未指定选项 “Qc”,则不计算此列表。
0.12.0 版本新增。
vertex_neighbor_vertices
包含两个整型 ndarray 的元组;(indptr, indices)顶点的相邻顶点。
- furthest_site
如果这是最远点三角剖分则为 True,否则为 False。
1.4.0 版本新增。
方法
add_points
(points[, restart])处理一组额外的新点。
结束
()结束增量处理。
find_simplex
(self, xi[, bruteforce, tol])查找包含给定点的单形。
lift_points
(self, x)将点提升到 Qhull 抛物面。
plane_distance
(self, xi)计算从所有单形到点 xi 的超平面距离。
- 抛出:
- QhullError
当 Qhull 遇到错误条件时抛出,例如未启用解决选项时的几何退化。
- ValueError
如果输入了不兼容的数组,则抛出。
说明
剖分是使用 Qhull 库 Qhull 库计算的。
注意
除非您传入 Qhull 选项 “QJ”,否则 Qhull 不保证每个输入点都作为顶点出现在 Delaunay 三角剖分中。省略的点列在 coplanar 属性中。
示例
点集的三角剖分
>>> import numpy as np >>> points = np.array([[0, 0], [0, 1.1], [1, 0], [1, 1]]) >>> from scipy.spatial import Delaunay >>> tri = Delaunay(points)
我们可以绘制它
>>> import matplotlib.pyplot as plt >>> plt.triplot(points[:,0], points[:,1], tri.simplices) >>> plt.plot(points[:,0], points[:,1], 'o') >>> plt.show()
构成三角剖分的两个三角形的点索引和坐标
>>> tri.simplices array([[2, 3, 0], # may vary [3, 1, 0]], dtype=int32)
请注意,根据舍入误差的情况,单形的顺序可能与上面显示的不同。
>>> points[tri.simplices] array([[[ 1. , 0. ], # may vary [ 1. , 1. ], [ 0. , 0. ]], [[ 1. , 1. ], [ 0. , 1.1], [ 0. , 0. ]]])
三角形 0 是三角形 1 的唯一邻居,它位于三角形 1 的顶点 1 的对面
>>> tri.neighbors[1] array([-1, 0, -1], dtype=int32) >>> points[tri.simplices[1,1]] array([ 0. , 1.1])
我们可以找出点属于哪个三角形
>>> p = np.array([(0.1, 0.2), (1.5, 0.5), (0.5, 1.05)]) >>> tri.find_simplex(p) array([ 1, -1, 1], dtype=int32)
数组中返回的整数是对应点所在的单形的索引。如果返回 -1,则该点不在任何单形中。请注意,以下示例中的快捷方式仅对有效点正确,因为无效点会导致 -1,而 -1 本身是列表中最后一个单形的有效索引。
>>> p_valids = np.array([(0.1, 0.2), (0.5, 1.05)]) >>> tri.simplices[tri.find_simplex(p_valids)] array([[3, 1, 0], # may vary [3, 1, 0]], dtype=int32)
我们还可以计算这些点在三角形 1 中的重心坐标
>>> b = tri.transform[1,:2].dot(np.transpose(p - tri.transform[1,2])) >>> np.c_[np.transpose(b), 1 - b.sum(axis=0)] array([[ 0.1 , 0.09090909, 0.80909091], [ 1.5 , -0.90909091, 0.40909091], [ 0.5 , 0.5 , 0. ]])
第一个点的坐标都为正,表示它确实在三角形内部。第三个点在一条边上,因此其第三个坐标为零。