Catmull Rom Spline实现(LibGDX)

时间:2015-08-22 23:05:05

标签: java android libgdx catmull-rom-curve

我想在屏幕上生成一个随机样条线。 以下是我到目前为止的情况:

public class CurvedPath {

Random rn;
CatmullRomSpline<Vector2> curve;

float[] xPts;
float[] yPts;
Vector2[] points;

public CurvedPath(){
    points = new Vector2[10];
    rn = new Random();
    curve = new CatmullRomSpline<Vector2>(points,false);

    for(int i = 0 ; i < 10; i++){
        xPts[i] = rn.nextFloat()*SampleGame.WIDTH;
        yPts[i] = SampleGame.HEIGHT*i/10;
    }


}

}

我对提供的有关如何使用CatmullRomSpline对象(https://github.com/libgdx/libgdx/wiki/Path-interface-&-Splines

的文档感到困惑

基本上我在这里要做的是生成10个随机点,均匀分布在我的屏幕高度,随机放置在屏幕的宽度上,以创建一个随机曲线路径。

因此,在构造函数的for循环中,您可以看到我为样条曲线生成每个控制点的x和y值。

如何将这些点输入到样条线对象中并在屏幕上呈现?

-Thanks

更新 让我重新提一下我的问题,让它更具体一点......

我的控制点由xPtsyPts.表示现在我想获得沿样条曲线落下的点,我如何使用这两个向量做到这一点? CatmullRomSpline的构造函数需要Vector2,而不是两个float[]

2 个答案:

答案 0 :(得分:3)

你做了什么。填写积分:

curve = new CatmullRomSpline<Vector2>(points,false);

要在曲线上得到一个点:

Vector2 point = new Vector2();
curve.valueAt(point, 0.5f);

valueAt()参数说明:

1(点)您要查找的点存储在Vector2对象中。

  1. 在0和1之间浮动,0是第一个点,1是最后一个点。 0.5f是中间的。此浮点表示从第一个点到最后一个点的孔距。
  2. 获得和渲染100分可能如下所示:

    Vector2 point = new Vector2();
    for (int i = 0; i <= 100; i++) {
    
        curve.valueAt(point, i * 0.01f);
    
        // draw using point.x and point.y
    }
    

    回答您编辑过的问题:

    for(int i = 0 ; i < 10; i++){
            points[i].x = rn.nextFloat()*SampleGame.WIDTH;
            points[i].y = SampleGame.HEIGHT*i/10;
    }
    curve = new CatmullRomSpline<Vector2>(points,false);
    

答案 1 :(得分:0)

此过程也在此详述:https://github.com/libgdx/libgdx/wiki/Path-interface-&-Splines

    /*members*/
    int k = 100; //increase k for more fidelity to the spline
    Vector2[] points = new Vector2[k];

    /*init()*/
    CatmullRomSpline<Vector2> myCatmull = new CatmullRomSpline<Vector2>(dataSet, true);
    for(int i = 0; i < k; ++i)
    {
        points[i] = new Vector2();
        myCatmull.valueAt(points[i], ((float)i)/((float)k-1));
    }