【问题标题】:Barycentric coordinates of a tetrahedron四面体的重心坐标
【发布时间】:2016-11-27 11:36:00
【问题描述】:

我想就四面体的重心坐标寻求帮助:

按照我在这里找到的方法: http://www.cdsimpson.net/2014/10/barycentric-coordinates.html 我实现了一个 C++ 函数,用于查找四面体中点的重心坐标:

float ScTP(const Vec &a, const Vec &b, const Vec &c)
{
    // computes scalar triple product
    return Dot(a, Cross(b, c));
}

Vec4f bary_tet(Vec3f a, Vec3f b, Vec3f c, Vec3f d, Vec3f p)
{
    float va, vb, vc, vd, v;
    Vec3f vap = p - a;
    Vec3f vbp = p - b;
    Vec3f vcp = p - c;
    Vec3f vdp = p - d;

    Vec3f vab = b - a;
    Vec3f vac = c - a;
    Vec3f vad = d - a;

    Vec3f vbc = c - b;
    Vec3f vbd = d - b;
    // ScTP computes the scalar triple product
    va = ScTP(vbp, vbd, vbc) * 1 / 6;
    vb = ScTP(vap, vac, vad) * 1 / 6;
    vc = ScTP(vap, vad, vab) * 1 / 6;
    vd = ScTP(vap, vab, vac) * 1 / 6;
    v = 1 / ScTP(vab, vac, vad) * 1 / 6;
    return Vec4f(va*v, vb*v, vc*v, vd*v);
}

但是,我的代码似乎计算出了稍微错误的重心坐标 - 将我的结果与此处的参考实现进行比较: http://dennis2society.de/painless-tetrahedral-barycentric-mapping 我的四个重心值都小于计算的值 参考实现。

有人发现我的实施中有任何错误吗?非常感谢您的帮助!

【问题讨论】:

  • 小了多少?不能只是floatdouble 精度吗? (没有运行你的代码,因为它看起来不是很完整,ScTP 看起来不见了)(你也不应该像这样复制输入参数......使用const Vec3f & a 而不是,如果性能很重要(可能是,因为否则你为什么要用float而不是double)
  • 很遗憾没有,我的值大约小了 1/40..
  • 感谢您的建议,我还没有寻找速度,但我会在最终实现时添加它。我还在代码中添加了 ScTP 函数
  • 我不确定,但我认为“v”可能会以您想要的其他方式书写。你想要 (1/6)*ScTP 然后翻转?但是你先做 1/ScTP,然后再做 /6。顺便说一句,如果我没有完全失去所有数学技能,你可以简单地放弃所有 1/6,如果你只使用 va/v,...

标签: c++ coordinates tetrahedra


【解决方案1】:

盲猜:

Vec4f bary_tet(const Vec3f & a, const Vec3f & b, const Vec3f & c, const Vec3f & d, const Vec3f & p)
{
    Vec3f vap = p - a;
    Vec3f vbp = p - b;

    Vec3f vab = b - a;
    Vec3f vac = c - a;
    Vec3f vad = d - a;

    Vec3f vbc = c - b;
    Vec3f vbd = d - b;
    // ScTP computes the scalar triple product
    float va6 = ScTP(vbp, vbd, vbc);
    float vb6 = ScTP(vap, vac, vad);
    float vc6 = ScTP(vap, vad, vab);
    float vd6 = ScTP(vap, vab, vac);
    float v6 = 1 / ScTP(vab, vac, vad);
    return Vec4f(va6*v6, vb6*v6, vc6*v6, vd6*v6);
}

【讨论】:

  • 非常感谢,您的版本有效!!我理解我的代码中的错误。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2020-12-29
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多