Я хотел бы попросить помощи относительно барицентрических координат тетраэдра:
Следуя подходу, который я нашел здесь: 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 каждое из моих четырех барицентрических значений меньше значений, рассчитанных эталонной реализацией.
Кто-нибудь заметил ошибку в моей реализации? Большое спасибо за помощь!
float
противdouble
точности? (не запускал ваш код, так как он выглядит не очень полным,ScTP
выглядит отсутствующим) (также вам не следует копировать входные параметры, подобные этому... скорее используйтеconst Vec3f & a
, если важна производительность (вероятно, потому что иначе зачем бы вы используетеfloat
вместоdouble
) - person Ped7g   schedule 23.07.2016