1、什麼是質心座標?
在幾何結構中,質心座標是指圖形中的點相對各頂點的位置。this
以圖1的線段 AB 爲例,點 P 位於線段 AB 之間,spa
圖1 線段AB和點Pcode
此時計算點 P 的公式爲 。orm
同理,在三角形 ABC 中,三角形內點 P 的計算公式爲:——公式一。blog
公式一的最終表示形式爲:it
那麼如何計算參數 m 和 n 呢?io
下面給出推導過程:form
根據公式一可得:class
咱們將 記做向量
,將
記做向量
, 將
記做向量
,則公式爲:cli
而後分別乘以 v0 和 v1 獲得以下兩個公式:
繼續化解方程式得:
令:
繼續化簡方程式得:
根據萊布尼茨公式可得:
其中d =
2、質心座標的應用
質心座標的應用場景不少,能夠用於:
- 判斷一個點是否在三角形內
- 根據三角形三個頂點獲得三角形內一個點P
3、代碼實現
已知三角形的三個頂點,計算三角形內一個點 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; }