C#从一个位置到另一个位置

时间:2015-10-09 18:22:11

标签: c# position lerp

我需要制作一个从一个位置到另一个位置的图像框(就像你可以一致地做到这一点)。
我怎么能这样做,是否有内置功能?
谢谢:))

4 个答案:

答案 0 :(得分:5)

线性插值(lerp)实际上是一个非常容易实现的功能。等式是

float Lerp(float firstFloat, float secondFloat, float by)
{
     return firstFloat * (1 - by) + secondFloat * by;
}

更高阶的Lerp只包含低阶lerps:

Vector2 Lerp(Vector2 firstVector, Vector2 secondVector, float by)
{
    float retX = Lerp(firstVector.x, secondVector.x, by);
    float retY = Lerp(firstVector.y, secondVector.y, by);
    return new Vector2(retX, retY);
}

DirectX SDK具有各种数学函数,如Unity,但这只是为Lerp引入的大量开销。你可能最好只实现自己的。

答案 1 :(得分:3)

Greg Bahm编写了逆lerp方程firstFloat * by + secondFloat * (1 - by),其中firstFloat是secondFloat,secondFloat是firstFloat。

事实上,科伦特·勒普方程是:

firstFloat * (1 - by) + secondFloat * by

但是最快的线性插值方法是:

firstFloat + (secondFloat - firstFloat) * by

这是2个加减法和1个乘法,而不是2个加减法和2个乘法。 Vector2的Lerp是正确的。

答案 2 :(得分:1)

    public static float CubicInterpolation(float v0, float v1, float v2, float v3, float t) {
        //var v01 = Lerp( v0, v1, t );
        //var v12 = Lerp( v1, v2, t );
        //var v23 = Lerp( v2, v3, t );
        //var v012 = Lerp( v01, v12, t );
        //var v123 = Lerp( v12, v23, t );
        //return Lerp( v012, v123, t );
        var p = (v3 - v2) - (v0 - v1);
        var q = (v0 - v1) - p;
        var r = v2 - v0;
        var s = v1;
        return (p * t * 3) + (q * t * 2) + (r * t) + s;
        //var r = 1f - t;
        //var f0 = r * r * r;
        //var f1 = r * r * t * 3;
        //var f2 = r * t * t * 3;
        //var f3 = t * t * t;
        //return (v0 * f0) + (v1 * f1) + (v2 * f2) + (v3 * f3);
    }
    public static float QuadraticInterpolation(float v0, float v1, float v2, float t) {
        var v01 = Lerp( v0, v1, t );
        var v12 = Lerp( v1, v2, t );
        return Lerp( v01, v12, t );
    }
    public static float Lerp(float v1, float v2, float t) {
        return v1 + ((v2 - v1) * t);
    }


    public static float CosInterpolation(float t) {
        t = (float) -Math.Cos( t * Math.PI ); // [-1, 1]
        return (t + 1) / 2; // [0, 1]
    }
    public static float PerlinSmoothStep(float t) {
        // Ken Perlin's version
        return t * t * t * ((t * ((6 * t) - 15)) + 10);
    }
    public static float SmoothStep(float t) {
        return t * t * (3 - (2 * t));
    }

答案 3 :(得分:0)

试试看

  float Lerp(float a, float b, float t)
    {
        //return firstFloat * by + secondFloat * (1 - by);
        return (1f - t) * a + t * b;
    }

    PointF Lerp(PointF a, PointF b, float t)
    {
        float retX = Lerp(a.X, b.X, t);
        float retY = Lerp(a.Y, b.Y, t);
        return new PointF(retX, retY);
    }