質心坐標(barycentric coordinates)及其應用


一、什么是質心坐標?

在幾何結構中,質心坐標是指圖形中的點相對各頂點的位置。

以圖1的線段 AB 為例,點 P 位於線段 AB 之間,

  圖1 線段AB和點P

 

此時計算點 P 的公式為 

 

同理,在三角形 ABC 中,三角形內點 P 的計算公式為:——公式一。

 公式一的最終表示形式為:

 

那么如何計算參數 m 和 n 呢?

下面給出推導過程:

根據公式一可得:

我們將  記作向量  ,將  記作向量  , 將  記作向量 ,則公式為:

然后分別乘以 v0  和 v1 得到如下兩個公式:

  

繼續化解方程式得:

 令:

繼續化簡方程式得:

根據萊布尼茨公式可得:

 

其中d = 

 

二、質心坐標的應用

質心坐標的應用場景很多,可以用於:

  • 判斷一個點是否在三角形內
  • 根據三角形三個頂點得到三角形內一個點P

 

三、代碼實現

 已知三角形的三個頂點,計算三角形內一個點 P 的代碼實現:

//vPos1, vPos2,vPos3 分別代表三角形的三個頂點
//vP代表三角形內的一個點、
//fI代表 vPos1的系數
//fJ代表 vPos2的系數
//fK 代表 vPos3的系數
bool GetBarycentricCoord(vec2 vPos1, vec2 vPos2, vec2 vPos3, vec2 vP, float& fI, float& fJ, float& fK)
{
    // Compute vectors
    vec2 v0 = vPos2 - vPos1;
    vec2 v1 = vPos3 - vPos1;
    vec2 v2 = vP - vPos1;

    // Compute dot products
    float fDot00 = Dot(v0, v0);
    float fDot01 = Dot(v0, v1);
    float fDot02 = Dot(v0, v2);
    float fDot11 = Dot(v1, v1);
    float fDot12 = Dot(v1, v2);

    // Compute barycentric coordinates
    float fInvDenom = 1 / (fDot00 * fDot11 - fDot01 * fDot01);
    float fTempU = (fDot11 * fDot02 - fDot01 * fDot12) * fInvDenom;
    float fTempV = (fDot00 * fDot12 - fDot01 * fDot02) * fInvDenom;

    // Check if point is in triangle or edge
    bool bIsInTri = (fTempU >= 0) && (fTempV >= 0) && (fTempU + fTempV <= 1);
    if (bIsInTri)
    {
        fJ = fTempU;
        fK = fTempV;
        fI = 1 - fJ - fK;
    }
    return bIsInTri;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM