什么是插值?
是什么?很简单! 已知两点,推断中间的每一点的过程。
有什么用? 很简单!位置从30到40耗时3秒求每一时刻的位置!
1.线性插值
设v是结果,start是开始,end是结尾,t是过去的时间,duration是总时间
v = start + (end - start) * (t / duration)
public static float Lerp(float start, float end, float step)
{
return start + step * (end - start);
}
2.三角插值
不要害怕,很简单,举个例子
已知 ABC三点的气温,平滑的求红色点的预测气温
求出这个点与ABC构成的三个三角形的面积,以及三角形ABC的面积。
gamma = Power C = (中心点和AB两点的三角形面积 / 大三角形面积)
beta = Power B = (中心点和AC两点的三角形面积 / 大三角形面积)
alpha = Power A = (中心点和BC两点的三角形面积 / 大三角形面积)
预测温度 = A权 * A温度 + B权 * B温度 + C权 * C温度
public static float Interpolate(Vector2 a, Vector2 b, Vector2 c, float tpA, float tpB, float tpC, Vector2 pos)
{
float area = CalculateTriangleArea(a, b, c);
// 计算点相对于三个顶点的重心坐标
float alpha = CalculateTriangleArea(pos, b, c) / area;
float beta = CalculateTriangleArea(a, pos, c) / area;
float gamma = CalculateTriangleArea(a, b, pos) / area;
// 使用重心坐标进行颜色插值
float temp = alpha * tpA + beta * tpB + gamma * tpC;
return temp;
}
/// <summary>
/// 计算三角形面积
/// </summary>
/// <param name="p1">点A坐标</param>
/// <param name="p2">点B坐标</param>
/// <param name="p3">点C坐标</param>
/// <returns></returns>
public static float CalculateTriangleArea(Vector2 p1, Vector2 p2, Vector2 p3)
{
return Math.Abs((p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y)) / 2f);
}