在 delaunay 三角剖分中考虑公共边来减少空间

Posted

技术标签:

【中文标题】在 delaunay 三角剖分中考虑公共边来减少空间【英文标题】:Reducing space taking common edges into account in delaunay triangulation 【发布时间】:2021-09-15 01:06:48 【问题描述】:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay

points = np.array([[0.2, 0], [0.1, 1.1], [0.6, 0.1], [1, 0.5], [0.6,0.9], [0.4,0.4]])
tri = Delaunay(points)

#plot
plt.triplot(points[:,0], points[:,1], tri.simplices)
plt.plot(points[:,0], points[:,1], 'o')
plt.show()

print(tri.points)
"""
[[0.2 0. ]
[0.  1.1]
[0.6 0. ]
[1.  1. ]
[0.2 0.8]
[0.4 0.4]]
"""
print(tri.simplices)
"""
[[0 5 1]
[5 4 1]
[4 5 3]
[5 2 3]
[2 5 0]]
"""

这是点数组的 delaunay 三角剖分。从单纯形(三角形)的输出中可以看出,三角形有共同的边,如 [0 5 1] 和 [5 4 1],由 2 个共同顶点(5 和 1)组成。我在想,当我将这两个三角形表示为 [5 1 0 4] 而不是使用 6 个数字来表示 2 个三角形时,我只使用 4 个数字,因此可以节省空间。另外我应该考虑到并非所有三角形都有共同的边缘。你认为这可以实现吗?我可以使用哪种数据结构来实现这一点?

【问题讨论】:

【参考方案1】:

我的第一个问题是你为什么要压缩这些三角形的存储,是不是你有一个非常大的网格。虽然您概述的方法可行,但它只减少了 33% 并导致一些并发症。

例如,假设我想通过您指定的方法检查您的三角形。要绘制两个三角形,我会这样做:

points = np.array(
 [[0.2, 0. ],
 [0.1, 1.1],
 [0.6, 0.1],
 [1.,  0.5],
 [0.6, 0.9],
 [0.4, 0.4]]
)
two_triangles = [5, 1, 0, 4]
plt.plot(*points[two_triangles].T, 'ro')

现在,我可以尝试找到一种算法或方法来解释这 4 个点如何连接在一起形成两个独立的三角形,但这并不容易,我什至不知道这 4 个点中的哪一个是相关联的:

plt.plot(*points[two_triangles].T, 'ro')
plt.plot(*points[two_triangles + [two_triangles[0]]].T, 'b--')  # the + [] here joins back to first element

(更不用说如果我有奇数个三角形会发生什么)

如果我遵循基本方法,肯定效率较低,但网格是一般且立即显而易见的:

points = np.array(
 [[0.2, 0. ],
 [0.1, 1.1],
 [0.6, 0.1],
 [1.,  0.5],
 [0.6, 0.9],
 [0.4, 0.4]]
)
triangle_a = [5, 1, 0]
triangle_b = [5, 4, 1]
plt.plot(*points[triangle_a].T, 'ro')
plt.plot(*points[triangle_a + [triangle_a[0]]].T, 'r--')

plt.plot(*points[triangle_b].T, 'bo')
plt.plot(*points[triangle_b + [triangle_b[0]]].T, 'b--')

每个三角形都是自包含的,每个三角形中的每个点都连接到其他每个点,并且使用起来更容易。

我再次回到基本问题,即为什么要压缩它,然后可能有更好的方法来获得它。

【讨论】:

我只是为了减少文件大小而考虑它。也不是通过只绘制一次而不是两次来减少cpu时间吗? 事实上我在想一个像这样的一维数组的系列。 [0 5 4 1 3..] 就像取前 3 个并从 [0 5 4] 制作一个三角形。然后只加 1。(第 2 个三角形)然后只加 3(第 3 个三角形)。如果剩下不匹配的顶点,则添加到数组的末尾并最后绘制它们。这可以使它比我认为的 %50 更好。 我的意思是,当您添加一个新点并利用与前一个三角形的公共边时,您会绘制两条边,然后不清楚您将其中哪些用作公共边在你的下一个三角形边缘。但我再次回到我的观点,你为什么要这样做。如果它是存储 1)这不是您需要的区域(这些数字可以存储在 16 位整数中,因为您的坐标需要更多空间)和 2)您正在生成针对您的问题定制的压缩算法,当许多通用压缩算法可能就足够了。

以上是关于在 delaunay 三角剖分中考虑公共边来减少空间的主要内容,如果未能解决你的问题,请参考以下文章

谁对opencv里面的delaunay三角剖分方法比较熟悉的

在 RGB 通道而不是最终图像上应用 Delaunay 三角剖分

高效的 Delaunay 三角剖分

适用于 GPU 的最快可用 Delaunay 三角剖分算法

Delaunay三角剖分后如何生成边缘索引?

来自 voronoi 镶嵌的 Delaunay 三角剖分