我有一个由两个变量描述的不规则网格 - 一个存储构成每个面的顶点索引的面数组,以及一个存储每个顶点坐标的顶点数组。我还有一个假定在每个面上是分段常数的函数,它以每个面的值数组的形式存储。
我正在寻找一种从这些数据构建函数f
的方法。以下内容:
faces = [[0,1,2], [1,2,3], [2,3,4] ...]
verts = [[0,0], [0,1], [1,0], [1,1],....]
vals = [0.0, 1.0, 0.5, 3.0,....]
f = interpolate(faces, verts, vals)
f(0.2, 0.2) = 0.0 # point inside face [0,1,2]
f(0.6, 0.6) = 1.0 # point inside face [1,2,3]
评估f(x,y)
的手动方式是找到点x,y
所在的相应面,并返回存储在该面中的值。是否有一个函数已经在scipy(或matlab)中实现了这个功能?
答案 0 :(得分:1)
这对我来说听起来并不像插值那样找到哪个三角形面对点是内部的。检查this site以确定测试每个三角形面的方法。您的函数将只确定它所在的面并返回相应的值。当然,如果你有很多面孔,或者如果你这么做很多,那么你会想找到优化它的方法(在x和y方向存储最远的+和 - 点并存储例如,如果该点不在此边界框内,那么您也可以不检查它是否在三角形内部。
我真的怀疑你会发现内置于Matlab或scipy的内容可以做你想要的东西,但我可能错了。
答案 1 :(得分:1)
你可能想要使用网桥CGAL-python模块;如果我没记错的话,CGAL提供了三角形搜索的功能。但是,如果使用内置表示法逐步构建三角剖分,它可能效率最高。对于快速和肮脏的一个,你可以找到最接近查询点的网格顶点,通过Voronoi图(在Matlab中的功能不是很好),或者,对于单个查询,计算所有距离,并找到最小值,然后搜索具有该顶点的所有三角形。
答案 2 :(得分:1)
Matlab具有内置函数inpolygon,允许您测试是否在三角形内。我不知道哪个函数可以识别你的面部。
如果您要编写这样的函数,我首先测试您的点最接近的顶点,然后在共享顶点的所有面上进行多边形评估,直到找到匹配为止。这应该相当快。
答案 3 :(得分:1)
查看matplotlib.delaunay.interpolate
,这是一个记录良好的C代码包装器
(但class LinearInterpolator
说
“目前,只支持常规的矩形网格进行插值。”)
答案 4 :(得分:1)
MATLAB中没有内置函数可以满足您的需求。您可以使用函数INPOLYGON作为suggested by Jonas来构建自己的算法,但是您可以使用一些标准算法自己创建更快的实现来查找点是否在多边形内。
前段时间我编写了自己的代码,用于在3-D中找到线段和一组三角形曲面之间的交点,我发现this softsurfer link对实现算法最有帮助。我的情况比你的情况复杂。由于您使用的是2-D,因此可以忽略链接的第一部分,该部分是关于找到线段与三角形平面相交的点。
我在下面提供了我的MATLAB代码的简化版供您使用。函数interpolate
会将您的faces
,vertices
和values
矩阵作为输入,并返回一个函数句柄f
,该句柄可以在给定的位置进行评估(x ,y)指向获取边界三角形内的分段值。以下是此代码的一些功能:
f
时将要执行的处理包含在nested function evaluate_function
中。此函数可以访问interpolate
中的其他变量,因此三角形内部测试所需的许多变量都是预先计算的,以便evaluate_function
尽可能快地运行。f
会返回NaN的值。代码中没有包含一些内容,您可能需要添加这些内容,具体取决于您使用它的目的:
faces
是N-by-3矩阵,vertices
是M-by-2矩阵,{{1是一个长度为N的向量。您可能希望添加错误检查以确保输入符合这些要求,并抛出错误,指示其中一个或多个不正确。values
和faces
输入定义的一个或多个三角形可能会退化(即它们的面积可能为0) )。当两个或多个三角形顶点是相同的精确点时,或者当三角形的所有三个顶点都在一条直线上时,会发生这种情况。在评估vertices
时,您可能希望添加一个忽略此类三角形的检查。f
变量中面部列表开头的面值。最后,这是代码:
faces