重心座標

barycentric-coordinates.png


三角形の中の点Pを重心座標で表現すると

(1)
\begin{align} 0<u<1,0<v<1\\ P=A+u(C-A)+v(B-A) \end{align}

となります

重心座標を求めるソースコード

    /**
    * @brief 点pの三角形tにおける重心座標を得る
    * @return (1,0,0)=t.a, (0,1,0)=t.b,(0,0,1)=t.c
    * 点pが三角形の内側ならばx+y+z<1.0
    * x=a,y=b,z=c*/
    glm::vec3 barycentric(const glm::vec3& p,const tri& t) {
        //http://www.blackpawn.com/texts/pointinpoly/default.html
        glm::vec3 ac = (t.c) - (t.a);
        glm::vec3 ab = (t.b) - (t.a);
        glm::vec3 ap = p - (t.a);
 
        //点の位置pから重心座標パラメータ(u,v)を解くために必要な値を計算する
        float acac = glm::dot(ac, ac);
        float acab = glm::dot(ac, ab);
        float acap = glm::dot(ac, ap);
        float abab = glm::dot(ab, ab);
        float abap = glm::dot(ab, ap);
 
        float denom = acac * abab - acab * acab;
 
        if (denom == 0) {
            cout << "devide by 0 at point triangle hit test" << endl;
            return glm::vec3();
        }
 
        float u = (abab * acap - acab * abap) / denom;
        float v = (acac * abap - acab * acap) / denom;
        return  glm::vec3(1.0 - u - v,v,u);
    }
Bibliography

barycentric

サポートサイト Wikidot.com barycentric