Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 计算多个三角形的重心_Matlab_Vertex_Centroid - Fatal编程技术网

Matlab 计算多个三角形的重心

Matlab 计算多个三角形的重心,matlab,vertex,centroid,Matlab,Vertex,Centroid,我想计算三角形列表中每个单独的重心(质心)。到目前为止,我已经写了这么多: function Triangle_Source_Centroid(V_Epoch0, F_Epoch0) for i = 1:length(F_Epoch0) Centroid_X = F_Epoch0(V_Epoch0(:,1),1) + F_Epoch0(V_Epoch0(:,1),2) + F_Epoch0(V_Epoch0(:,1),3); Cent

我想计算三角形列表中每个单独的重心(质心)。到目前为止,我已经写了这么多:

 function Triangle_Source_Centroid(V_Epoch0, F_Epoch0)


        for i = 1:length(F_Epoch0)


        Centroid_X = F_Epoch0(V_Epoch0(:,1),1)  + F_Epoch0(V_Epoch0(:,1),2)  + F_Epoch0(V_Epoch0(:,1),3);
        Centroid_Y = F_Epoch0(V_Epoch0(:,2),1)  + F_Epoch0(V_Epoch0(:,2),2)  + F_Epoch0(V_Epoch0(:,2),3);
        Centroid_Z = F_Epoch0(V_Epoch0(:,3),1)  + F_Epoch0(V_Epoch0(:,3),2)  + F_Epoch0(V_Epoch0(:,3),3);

        Triangle_Centroid = [Centroid_X; Centroid_Y; Centroid_Z];

        end
end
它不工作,只给我一条错误消息:

Subscript indices must either be real positive integers or logicals.

考虑到变量的命名方式,我猜测
V_Epoch0
是一个N×3的顶点矩阵(X、Y和Z表示列),而
F_Epoch0
是一个m×3的面索引矩阵(每一行是一组列索引到
V_Epoch0
显示每个三角形的点)。假设这是对的

实际上,在这种情况下,您可以通过使用来避免使用for循环。例如,要获取
F_Epoch0
中每个点的X坐标,可以执行以下操作:

allX = reshape(V_Epoch0(F_Epoch0, 1), size(F_Epoch0));
然后,您可以跨列获取每个三角形面的平均X坐标:

meanX = mean(allX, 2);
meanX
现在是一个M×1的列向量。然后可以对Y和Z坐标重复此操作:

allY = reshape(V_Epoch0(F_Epoch0, 2), size(F_Epoch0));
meanY = mean(allY, 2);
allZ = reshape(V_Epoch0(F_Epoch0, 3), size(F_Epoch0));
meanZ = mean(allZ, 2);
centroids = [meanX meanY meanZ];
质心
是三角形质心坐标的M×3矩阵

奖金:

实际上,以上所有操作都可以通过这一行完成:

centroids = squeeze(mean(reshape(V_Epoch0(F_Epoch0, :), [size(F_Epoch0, 1) 3 3]), 2));

查看的文档以了解其工作原理。

鉴于变量的命名方式,我猜测
V_Epoch0
是一个N×3的顶点矩阵(X、Y和Z表示列),
F_Epoch0
是一个m×3的面索引矩阵(每一行都是一组行索引,这些索引进入
V_Epoch0
显示每个三角形的点)。假设这是正确的

实际上,在这种情况下,您可以通过使用来避免使用for循环。例如,要获取
F_Epoch0
中每个点的X坐标,可以执行以下操作:

allX = reshape(V_Epoch0(F_Epoch0, 1), size(F_Epoch0));
然后,您可以跨列获取每个三角形面的平均X坐标:

meanX = mean(allX, 2);
meanX
现在是一个M-x-1列向量。然后可以对Y和Z坐标重复此操作:

allY = reshape(V_Epoch0(F_Epoch0, 2), size(F_Epoch0));
meanY = mean(allY, 2);
allZ = reshape(V_Epoch0(F_Epoch0, 3), size(F_Epoch0));
meanZ = mean(allZ, 2);
centroids = [meanX meanY meanZ];
质心
是三角形质心坐标的M×3矩阵

奖金:

实际上,以上所有操作都可以通过这一行完成:

centroids = squeeze(mean(reshape(V_Epoch0(F_Epoch0, :), [size(F_Epoch0, 1) 3 3]), 2));

查看的文档了解更多有关此操作的信息。

第一步:检查
V_Epoch0
中的零。检查零是什么意思?V_Epoch0包含每个顶点的坐标这是您的问题。您将其用作
F_Epoch0
的索引。索引必须是正整数。上述语句适用于理论上,uld通过F_Epoch0(包含所有三角形参与点),然后从V_Epoch0中提取特定点的坐标,因此最终将得到(p1x+p2x+p3x)/对于y和z也是一样的,这必须发生在F中的所有三角形上_Epoch0@AlanDeMoin考虑接受帮助你的答案,点击左边箭头下方的绿色记号。第一步:检查<代码> VY-EPOCH0中的零点。你指的是检查零点吗?VyEPICH0包含每个顶点的坐标。m、 您正在使用它作为
F_Epoch0
的索引。索引必须是正整数。理论上,上述语句应该经过F_Epoch0(包含所有三角形参与点),然后从V_Epoch0中提取特定点的坐标,以便最终得到(p1x+p2x+p3x)/对于y和z也是一样的,这必须发生在F中的所有三角形上_Epoch0@AlanDeMoin考虑接受帮助你的答案,点击左下方箭头下方的绿色记号。