Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 提取8个点/顶点内的体素_Matlab_Geometry_Box_Normals_Vertices - Fatal编程技术网

Matlab 提取8个点/顶点内的体素

Matlab 提取8个点/顶点内的体素,matlab,geometry,box,normals,vertices,Matlab,Geometry,Box,Normals,Vertices,事情是这样的:我在3D体积中有8个点/顶点。 我想知道点x是否包含在顶点由8个点给出的长方体中 此外,我知道有4个点位于与y轴平行(我们称之为a)的平面上,另外4个点也位于与y轴平行(B)的另一个平面上 给定A和B,它们是顶点的4x3矩阵 我计算连接两对顶点的线,它们位于长方体的边界超平面上 LinesJoiningVertices = [A(2,:) - A(1,:), B(1,:) - A(1,:); A(1,:) - A(1,:)

事情是这样的:我在3D体积中有8个点/顶点。 我想知道点x是否包含在顶点由8个点给出的长方体中

此外,我知道有4个点位于与y轴平行(我们称之为a)的平面上,另外4个点也位于与y轴平行(B)的另一个平面上

给定A和B,它们是顶点的4x3矩阵

我计算连接两对顶点的线,它们位于长方体的边界超平面上

    LinesJoiningVertices = 
            [A(2,:) - A(1,:), B(1,:) - A(1,:);
             A(1,:) - A(1,:), A(4,:) - A(1,:);
             A(3,:) - A(4,:), B(4,:) - A(4,:);
             A(2,:) - B(2,:), B(3,:) - B(2,:);
             B(2,:) - B(1,:), B(4,:) - B(1,:);
             A(1,:) - B(1,:), B(4,:) - B(1,:)]
我计算每个边界超平面的法线

   for i = 1:6
       normals(i,:) = cross(LinesJoiningVertices(i,1:3), LinesJoiningVertices(i,4:6))
   end
理论上,方框内的点x应该与每个法线有一个负的点积(不是吗?)。 实际上,它不起作用。取一个我知道在方框内的点x,对于第一个、第三个和第五个法线,答案大于0

我的代码中有错误吗?
我的数学有错误吗

您拥有不同点的所有位置,以及点的位置
x
。想象一个中心点是
(0,0,0)
,你的点围绕它形成一个立方体。制作立方体的所有外表面,就像使用
线连接顶点
但使用
所做的那样。您应该有6个外部

现在你必须检查你的
x
点是在立方体的每个
面之前还是之后。如果该点位于每个
面之前
,则该点包含在多维数据集中。这也适用于非立方体。

  • 首先,让我告诉你一件事
对于两个平行平面,任何包含四个点的两个子集的三维多边形位于这两个平面中的一个平面上,只能用6个点来识别,其中每3个点可以表示包含该多边形的一个面的平面

对于平行于由{B_0,B_1,B_2}构成的平面上的任意6个点,{A_0,A_2,A_3},剩下的两个点需要一个允许多边形的条件,否则,我们可以面对任何不一致分布的坐标,这些坐标形成一个随机的非线性形状或圆或任何东西。显示哪些两条相同颜色的线必须平行,以将剩余的点作为这些线的交点

  • Sencondo,让我们继续计算给定的最后信息作为背景
首先,点的坐标可以由系统生成:

syms x y z
P = [x,y,z]
left_x=0;right_x=4;

for j=0:1, for k=0:1, A((j)*2+k+1,1:3)=[left_x;floor(10*rand());floor(10*rand())];end,end
for j=0:1, for k=0:1, B((j)*2+k+1,1:3)=[right_x;floor(10*rand());floor(10*rand())];end,end
或者,手动键入

syms x y z
P = [x,y,z]


left_x=input('enter first x ');
for j=0:1, for k=0:1*~j,  A((j)*2+k+1,1:3)=[left_x;input(['print y' char((j)*2+k+49) ' ']);input(['print z' char((j)*2+k+49) ' '])];end,end,
right_x=input('enter second x ');
for j=0:1, for k=0:1*~j,  B((j)*2+k+1,1:3)=[right_x;input(['print y' char((j)*2+k+49) ' ']);input(['print z' char((j)*2+k+49) ' '])];end,end,
2-现在,我们计算其中哪些点更接近y轴(更近),哪些点更接近x轴(更低),以找到由每个3个点构成的4个虚拟平面的方程

close_right_point=B((B(:,3)==min(B(:,3))),:)

far_right_point=B((B(:,3)==max(B(:,3))),:)

if(numel(close_right_point(:,1))==1)
temp=B((B(:,3)==min(B(B(:,3)~=min(B(:,3)),3))) ,:);
middler_points(2,:)=temp(1,:);
else
middler_points(2,:)=close_right_point(2,:);
end




closer_point=middler_points(middler_points(:,3)==min(middler_points(1,3),middler_points(2,3)),:)
if(numel(closer_point(:,1))==1)
further_point=middler_points(middler_points(:,3)==max(middler_points(1,3),middler_points(2,3)),:)
else
further_point=closer_point(2,:)
end


close_normal = cross(closer_point(1,:)-close_right_point(1,:), closer_point(1,:)-close_left_point(1,:))

close_plane=dot(close_normal,P-closer_point)



far_normal = cross(further_point-far_right_point(1,:), further_point-far_left_point(1,:))

far_plane=dot(far_normal,P-further_point)









low_left_point=A((A(:,2)==min(A(:,2))),:)


if(numel(low_left_point(:,1))==1)
temp=A((A(:,2)==min(A(A(:,2)~=min(A(:,2)),2))),:);
average_points(1,:)=temp(1,:);
else
average_points(1,:)=low_left_point(2,:);
end

high_left_point=A((A(:,2)==max(A(:,2))),:)




low_right_point=B((B(:,2)==min(B(:,2))),:)

high_right_point=B((B(:,2)==max(B(:,2))),:)


if(numel(low_right_point(:,1))==1)
temp=B((B(:,2)==min(B(B(:,2)~=min(B(:,2)),2))),:);
average_points(2,:)=temp(1,:);
else
average_points(2,:)=low_right_point(2,:);
end



lower_point=average_points(average_points(:,2)==min(average_points(1,2),average_points(2,2)),:)
if(numel(lower_point(:,1))==1)
higher_point=average_points(average_points(:,2)==max(average_points(1,2),average_points(2,2)),:)
else
higher_point=lower_point(2,:);
end



low_normal = cross( lower_point(1,:)-low_right_point(1,:), lower_point(1,:)-low_left_point(1,:))

low_plane=dot(low_normal,P-lower_point)



high_normal = cross( higher_point-high_right_point(1,:), higher_point-high_left_point(1,:))

high_plane=dot(high_normal,P-higher_point)
请注意,法线是与其所代表平面垂直的向量,任何平面的方程都是从法线向量中提取的

如图所示,请参见平行平面和6个动态点,它们足以构成任何三维多边形

3-差不多完成了,继续下一阶段,我们通过用户输入接收所需点的坐标:

X=input('enter X ')
Y=input('enter Y ')
Z=input('enter Z ')
然后,检查点是否没有超出与y轴平行的两个平面相关的最右或最左

if (X>right_x)
'out-bounds'
return;
end


if (X<left_x)
'out-bounds'
return;
end
然后是浮点数

1
2
3

成功!,您可以通过单击任何点来查看/修改/检查结果,然后使用任何参数更改定义文本字段,您也可以拖动点。

这就是我正在做的,不是吗?每个法线都是一个面的表示。是的,它是。问题是:它不会总是给每个法线一个负的点积,这就是我说的“脸前”的意思如果你的脸在你x点的左边,它会给一个正的点积。。我错了吗?正如你所说,每个面的法线方向是相对于面的“局部”坐标系的。你必须确保你知道你想要6个面中的每一个都是哪个符号(实际上是4个,因为在y方向上检查很简单)。不是那么简单,我以立方体为例,但它可以是任何图形!看一看。计算自然坐标席,η,亩。如果这三个值都在-1和1之间,则该点位于方框内。
0
0
0
6
5.6
0
5.05
4
0
0
6.51
-0.16
6.33
3.59
1
2
3