26 float &u,
float &v,
float &w)
28 const QVector3D ab = b - a;
29 const QVector3D ac = c - a;
30 const QVector3D ap = p - a;
33 const float d1 = dot(ab, ap);
34 const float d2 = dot(ac, ap);
35 if (d1 <= 0.f && d2 <= 0.f) {
36 u = 1.0f; v = 0.0f; w = 0.0f;
41 const QVector3D bp = p - b;
42 const float d3 = dot(ab, bp);
43 const float d4 = dot(ac, bp);
44 if (d3 >= 0.f && d4 <= d3) {
45 u = 0.0f; v = 1.0f; w = 0.0f;
50 const float vc = d1 * d4 - d3 * d2;
51 if (vc <= 0.f && d1 >= 0.f && d3 <= 0.f) {
52 const float v_edge = d1 / (d1 - d3);
53 u = 1.0f - v_edge; v = v_edge; w = 0.0f;
54 return a + v_edge * ab;
58 const QVector3D cp = p - c;
59 const float d5 = dot(ab, cp);
60 const float d6 = dot(ac, cp);
61 if (d6 >= 0.f && d5 <= d6) {
62 u = 0.0f; v = 0.0f; w = 1.0f;
67 const float vb = d5 * d2 - d1 * d6;
68 if (vb <= 0.f && d2 >= 0.f && d6 <= 0.f) {
69 const float w_edge = d2 / (d2 - d6);
70 u = 1.0f - w_edge; v = 0.0f; w = w_edge;
71 return a + w_edge * ac;
75 const float va = d3 * d6 - d5 * d4;
76 if (va <= 0.f && (d4 - d3) >= 0.f && (d5 - d6) >= 0.f) {
77 const QVector3D bc = c - b;
78 const float w_edge = (d4 - d3) / ((d4 - d3) + (d5 - d6));
79 u = 0.0f; v = 1.0f - w_edge; w = w_edge;
80 return b + w_edge * bc;
84 const float denom = va + vb + vc;
87 if (
std::abs(denom) < 1e-20f) {
89 const float da = dot(ap, ap);
90 const float db = dot(bp, bp);
91 const float dc = dot(cp, cp);
92 if (da <= db && da <= dc) {
93 u = 1.0f; v = 0.0f; w = 0.0f;
97 u = 0.0f; v = 1.0f; w = 0.0f;
100 u = 0.0f; v = 0.0f; w = 1.0f;
104 const float invDenom = 1.0f / denom;
108 return a + v * ab + w * ac;
static QVector3D closestPointOnTriangle(const QVector3D &p, const QVector3D &a, const QVector3D &b, const QVector3D &c, const Dot &dot, float &u, float &v, float &w)