gpt4 book ai didi

matlab - 查询凸包内人工 block 的体积

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:26 24 4
gpt4 key购买 nike

问题:

我有一个三维点云,每个 block 的质心代表一个 block 。为简单起见,这个例子只是二维的。如图所示,我想根据参数包含感兴趣的 block 。在本例中, block 1、6、5、4。为了进一步处理它们,我需要通过使用 alpha 形状或凸包找到它们周围的最小外壳。我有每个质心的坐标,我知道 block 的扩展,所以我可以通过以下方式轻松找到 block 的边缘点:

    xdimension=5;
ydimension=5;
block1=[5 15 1];
block2=[5 10 0];
block3=[5 5 0];
block4=[10 5 1];
block5=[10 10 1];
block6=[10 15 1];
block7=[15 5 0];
block8=[15 10 0];
block9=[15 15 0];
blocks=[block1;block2;block3;block4;block5;block6;block7;block8;block9]

dimension=[xdimension/2 ydimension/2];
point1=[1 1].*dimension;
point2=[1 -1].*dimension;
point3=[-1 1].*dimension;
point4=[-1 -1].*dimension;
i=size(blocks,1);
point1=repmat(point1,i,1);
point2=repmat(point2,i,1);
point3=repmat(point3,i,1);
point4=repmat(point4,i,1);
edges1=[blocks(:,1:2)+point1, blocks(:,3)] ;
edges2=[blocks(:,1:2)+point2, blocks(:,3)];
edges3=[blocks(:,1:2)+point3, blocks(:,3)];
edges4=[blocks(:,1:2)+point4, blocks(:,3)];
edges=[edges1;edges2;edges3;edges4];
x=edges(edges(:,3)==1,1);
y=edges(edges(:,3)==1,2);
K=convhull(x,y)
scatter(edges(:,1), edges(:,2))
hold on
plot(x(K),y(K),'r-')
hold off

这会生成一张类似于此处的图片。

问题

如何查询 block 2 和 3 的凸包包含的表面(或者在我的实际问题中是体积)?我需要每个 individual block 的确切表面/体积,除了我指定的 block (这里有二进制指示器)。请注意,这是一个示例,我正在寻找如何独立于示例执行此操作的想法。我真的很感激一些帮助,因为我主要被困在这里,我不知道如何解决它。

enter image description here

最佳答案

在 2D 中我会使用 inpolygon函数来测试一个点是否在凸包与正方形 2 和 3 的交集内。

对于 3D,我没有在 MATLAB 中找到等效项,而是以下 matlab exchange file应该是解决方案。

如何使用函数 inhull 查找内部区域的点的示例:

% Create a 3D cube
cubePoints = randi(5,[500,3]);

% Bounding volume
boundingVolume = zeros(8,3);
boundingVolume(1,:) = [1,3,1];
boundingVolume(2,:) = [1,3,3];
boundingVolume(3,:) = [3,3,1];
boundingVolume(4,:) = [3,3,3];
boundingVolume(5,:) = [3,1,3];
boundingVolume(6,:) = [3,1,1];
boundingVolume(7,:) = [2,1,1];
boundingVolume(8,:) = [2,1,3];

% Find points inside area
inVol = inhull(cubePoints,boundingVolume);

% Plot the point in the bounding volume in blue and the points outsode the
% bounding volume in red
scatter3(cubePoints(:,1).*inVol,cubePoints(:,2).*inVol,cubePoints(:,3).*inVol,36,'blue');
hold on
scatter3(cubePoints(:,1).*~inVol,cubePoints(:,2).*~inVol,cubePoints(:,3).*~inVol,36,'red');

关于matlab - 查询凸包内人工 block 的体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39596015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com