我已经绘制了n
随机点(黑点)并使用了delaunay三角剖分,现在我想插入m
随机评估点(红点) )所以我需要计算评估点所在的三角形。
计算每个点的三角形顶点的方法是什么?
答案 0 :(得分:2)
对于给定的三角形ABC,如果点位于AB线的同一侧,则点位于三角形内部,与点A的线BC位于同一侧,并且位于线的同一侧AC作为B点。您可以为每个三角形预先优化此检查并检查它们,直到找到它所在的三角形。有关详细信息,请参阅this page。
为了节省计算,您可以计算每个三角形的点的最小和最大X和Y坐标。如果点的X和Y坐标不在最小值和最大值之内,则可以立即跳过检查该三角形。如果它不在限定三角形的矩形内,则该点不能在其中。
答案 1 :(得分:1)
我假设除了公共边之外三角形不相交。
您不希望独立检查每个三角形(或其子集)。主要原因是计算错误 - 由于它们,您可能会在“内部”回答多个三角形(或零),这可能会破坏程序的逻辑。
更强大的方式是:
即使由于计算错误而返回错误的三角形,仍然只有一个三角形,并且它将足够接近它以接受这样的错误。
对于#1,您可以像Michael Wild所说的那样使用四叉树之类的东西。
答案 2 :(得分:1)
Delaunay三角剖分本身就是一种搜索数据结构。您的Delaunay三角测量实现可能具有位置功能。你是如何计算你的分数的Delaunay三角剖分的?
CGAL具有2D和3D三角测量的实现。生成的数据结构能够使用来自给定点的步行来定位任何点。请参阅示例that chapter of the manual。 CGAL是一个C ++库,但它有python bindings。
答案 3 :(得分:1)
这个简单的例子对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
可视化(代码已省略):
虚线的青色线现在将要插入的点连接到它所在的三角形的顶点。黑色线条是凸包,实心青色线条是delaunay三角剖分。