Matlab 三角形内等距采样点(3d)

Matlab 三角形内等距采样点(3d),matlab,3d,sampling,Matlab,3d,Sampling,我需要在三维任意三角形内生成等距采样点。所谓“等距”是指包含三角形的平面内的点在两个垂直方向上形成具有均匀间隔坐标的网格 方法1: 在三角形中生成均匀分布的随机采样点有一个简单的方法。 我试着让它适应我的需要,但我只得到了以下几点: tri = [-10, 0, -5; 0, 10, 0; 10, 0, 5]; [X,Y] = meshgrid(linspace(0,1,100)); t = sqrt(X(:)); s = Y(:); points = (1 - t) * tri(1, :) +

我需要在三维任意三角形内生成等距采样点。所谓“等距”是指包含三角形的平面内的点在两个垂直方向上形成具有均匀间隔坐标的网格

方法1

在三角形中生成均匀分布的随机采样点有一个简单的方法。 我试着让它适应我的需要,但我只得到了以下几点:

tri = [-10, 0, -5; 0, 10, 0; 10, 0, 5];
[X,Y] = meshgrid(linspace(0,1,100));
t = sqrt(X(:));
s = Y(:);
points = (1 - t) * tri(1, :) + bsxfun(@times, ((1 - s) * tri(2, :) + s * tri(3, :)), t);
scatter3(points(:, 1), points(:, 2), points(:,3), '.')

结果不是均匀网格化的

方法2

更“经典”的方法是在xy平面中获取栅格,并将采样点投影到三角形平面上。我用重心坐标来决定这些点是否在三角形内

tri = [-10, 0, -5; 0, 10, 0; 10, 0, 5];
coeffPlane = cross(tri(3,:)-tri(1,:), tri(2,:)-tri(1,:));
offset = dot(coeffPlane, tri(3,:));
[X,Y] = meshgrid(linspace(-10,10,20));
X = X(:);
Y = Y(:);
Z = (offset-coeffPlane(1)*X-coeffPlane(2)*Y)/coeffPlane(3);
points = [X Y Z];
baryCoord = cartesianToBarycentric(triangulation([1,2,3], tri), ones(size(X)), points);
TFinTri = all(baryCoord>=0 & baryCoord<=1,2);
points(~TFinTri,:) = [];
scatter3(points(:, 1), points(:, 2), points(:,3), '.')
tri=[-10,0-5;0,10,0;10,0,5];
系数平面=交叉(三(3,:)-三(1,:),三(2,:)-三(1,:);
偏移=点(系数平面,三(3,:);
[X,Y]=网格网格(linspace(-10,10,20));
X=X(:);
Y=Y(:);
Z=(偏移系数平面(1)*X系数平面(2)*Y)/系数平面(3);
点=[X Y Z];
重心坐标=笛卡尔重心(三角剖分([1,2,3],tri),1(尺寸(X)),点);
TFinTri=all(baryCoord>=0&baryCoord我要做的是1)找到三角形平面的方程。2) 查找XY和平面之间的变换3)在XY中定义点,并将其变换(而不是投影)到平面中。4) 裁剪出三角形点。旋转变换应该可以完成这项工作。我要做的是1)找到三角形平面的方程。2) 查找XY和平面之间的变换3)在XY中定义点,并将其变换(而不是投影)到平面中。4) 裁剪出三角形点。旋转变换应该可以完成这项工作。