在 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三角剖分方法比较熟悉的