我已经绘制了n
随机点(黑点)并使用了 delaunay 三角剖分,现在我想插入m
随机评估点(红点),所以我需要计算评估点在哪个三角形内。
计算每个点的三角形顶点的方法是什么?
我已经绘制了n
随机点(黑点)并使用了 delaunay 三角剖分,现在我想插入m
随机评估点(红点),所以我需要计算评估点在哪个三角形内。
计算每个点的三角形顶点的方法是什么?
对于给定的三角形ABC,如果一个点与点C在AB线的同一侧,与A点在BC线的同一侧,并且与点AC在线的同一侧,则该点位于三角形内部B是。您可以为每个三角形预先优化此检查并检查它们,直到找到它所在的三角形。有关更多详细信息,请参阅此页面。
为了节省计算,您可以计算每个三角形的点的最小和最大 X 和 Y 坐标。如果某个点的 X 和 Y 坐标不在最小值和最大值范围内,您可以立即跳过检查该三角形。如果该点不在三角形边界的矩形内,则该点不能在其中。
我会假设三角形除了公共边外不相交。
您不想独立检查每个三角形(或它们的子集)。主要原因是计算错误 - 由于它们,您可能会在多个三角形(或零)的“内部”得到答案,这可能会破坏程序的逻辑。
更健壮的方法是:
即使你会因为计算错误而返回错误的三角形,仍然只有一个三角形,并且点将离它足够近,可以接受这样的错误。
对于#1,您可以使用 Michael Wild 建议的四叉树之类的东西。
这个简单的例子对 10 个随机点进行三角剖分,生成另外 3 个随机点,如果它们落在三角形内,则给出顶点:
import numpy as np
from pyhull.delaunay import DelaunayTri
def sign(a,b,c):
return (a[0]-c[0])*(b[1]-c[1])-(b[0]-c[0])*(a[1]-c[1])
def findfacet(p,simplice):
c,b,a = simplice.coords
b1 = sign(p,a,b) < 0.0
b2 = sign(p,b,c) < 0.0
b3 = sign(p,c,a) < 0.0
return b1 == b2 == b3
data = np.random.randn(10, 2)
dtri = DelaunayTri(data)
interpolate = np.random.randn(3, 2)
for point in interpolate:
for triangle in dtri.simplices:
if findfacet(point,triangle):
print "Point",point,"inside",triangle.coords
break
matplotlib
用于可视化(代码省略):
青色虚线现在连接点,以插入它所在的三角形的顶点。黑线是凸包,青色实线是德劳内三角剖分。