计算多个三角形的重心

时间:2017-09-12 21:09:57

标签: 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);
        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.

1 个答案:

答案 0 :(得分:2)

考虑到如何命名变量,我猜测V_Epoch0是一个N×3的顶点矩阵(列的X,Y和Z),而F_Epoch0是M-by-3面部索引矩阵(每行是V_Epoch0的一组行索引,显示每个三角形的哪些点)。假设这是对的......

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

allX = reshape(V_Epoch0(F_Epoch0, 1), size(F_Epoch0));

然后你可以在列之间取mean来获得每个三角形面的平均X坐标:

meanX = mean(allX, 2);

meanX现在是M-by-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];

并且centroids是三角形质心坐标的M×3矩阵。

<强>加成:

以上所有内容实际上只需要这一行就可以完成:

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

查看multidimensional arrays的文档,详细了解其工作原理。