Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有一个由两个变量描述的不规则网格:一个用于存储构成每个面的顶点索引的Faces数组和一个用于存储每个顶点坐标的verts数组。我也有一个函数,它假定在每个面上都是分段恒定的,并且以每个面的值数组的形式存储。
我正在寻找一种从该数据构造函数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)中实现? 回答: MATLAB中没有内置函数可以执行您想要的操作。您可以按照Jonas的建议使用INPOLYGON函数构建自己的算法,但是您可以使用一些标准算法来查找点是否在多边形内,从而自己创建一个更快的实现。 前一阵子,我写了自己的代码来查找线段和一组3-D中的三角形表面之间的交点,并且我发现此softsurfer链接对于实现算法最有用。我的案子比你的案子复杂。由于您使用的是2-D,因此可以忽略链接的第一部分,即查找线段与三角形平面相交的点。 我在下面提供了我的MATLAB代码的简化版本,供您使用。函数interpolate会将您的faces , vertices和values矩阵作为输入,并返回可以在给定(x,y)点求值的函数句柄f ,以获取边界三角形内的分段值。以下是此代码的一些功能:
function f = interpolate(faces,vertices,values) %# Precompute some data (helps increase speed): triVertex = vertices(faces(:,2),:); %# Triangles main vertices triLegLeft = vertices(faces(:,1),:)-triVertex; %# Triangles left legs triLegRight = vertices(faces(:,3),:)-triVertex; %# Triangles right legs C1 = sum(triLegLeft.*triLegRight,2); %# Dot product of legs C2 = sum(triLegLeft.^2,2); %# Squared length of left leg C3 = sum(triLegRight.^2,2); %# Squared length of right leg triBoundary = max(C2,C3); %# Squared radius of triangle boundary scale = C1.^2-C2.*C3; C1 = C1./scale; C2 = C2./scale; C3 = C3./scale; %# Return a function handle to the nested function: f = @evaluate_function; %# The nested evaluation function: function val = evaluate_function(x,y) w = [x-triVertex(:,1) y-triVertex(:,2)]; nearIndex = find(sum(w.^2,2) = 0) & (t >= 0) & (s+t |
![]() |
![]() |