【问题标题】:Calculating the barycenter of multiple triangles计算多个三角形的重心
【发布时间】:2017-09-12 21:09:57
【问题描述】:

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

 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中的零。
  • 检查零是什么意思? V_Epoch0 包含每个顶点的坐标
  • 你的问题。您将它用作F_Epoch0 的索引。索引必须是正整数。
  • 上述语句理论上应该经过F_Epoch0(包含所有三角形参与点),然后从V_Epoch0中拉取特定点的坐标,这样最终得到(p1x + p2x + p3x)/ 3; y 和 z 相同,这必须发生在 F_Epoch0 中的所有三角形
  • @AlanDeMoin 考虑接受对您有帮助的答案,方法是单击左侧箭头下方的绿色勾号。

标签: matlab vertex centroid


【解决方案1】:

鉴于变量的命名方式,我猜V_Epoch0 是一个 N×3 顶点矩阵(X、Y 和 Z 表示列),F_Epoch0 是一个 M×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×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 的文档以了解有关其工作原理的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2014-10-29
    相关资源
    最近更新 更多