什么是插值?

在这里插入图片描述
是什么?很简单! 已知两点,推断中间的每一点的过程。

有什么用? 很简单!位置从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);
        }