軟體光柵化渲染器(五)
阿新 • • 發佈:2018-12-30
三角形的線性插值
//輸入三角形的三個點,輸出三角形內一點的插值
float GetInterpValue(float x0, float y0, float value0,
float x1, float y1, float value1,
float x2, float y2, float value2,
float x, float y)
{
Vector3D p1 = { x1 - x, y1 - y, 0 };
Vector3D p2 = { x2 - x, y2 - y, 0 };
Vector3D p0 = { x0 - x, y0 - y };
Vector3D p12;
VectorCross(p12, p1, p2);
//三角形p12的面積
float Sp12 = CalculateVector3DLength(p12);
Vector3D p02;
VectorCross(p02, p0, p2);
//三角形p02的面積
float Sp02 = CalculateVector3DLength(p02);
Vector3D p01;
VectorCross(p01, p0, p1);
//三角形p01的面積
float Sp01 = CalculateVector3DLength(p01);
float total = Sp12 + Sp02 + Sp01;
//根據面積的權進行插值
float value = value0 * Sp12 / total + value1 * Sp02 / total + value2 * Sp01 / total;
return value;
}