2015-08-22 3 views
2

Я хочу создать случайный сплайн на моем экране. Вот то, что я до сих пор:Реализация сплайна Catmull Rom (LibGDX)

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 случайных точек, равномерно распределенных по высоте моего экрана, и случайным образом помещается вдоль ширины экрана для создания рандомизированного искривленного пути.

Итак, в цикле конструктора вы можете увидеть, что я генерирую значения x и y каждой контрольной точки для сплайна.

Как я могу ввести эти точки в объект сплайна и отобразить его на экране?

-Спасибо

обновление Позвольте мне перефразировать мой вопрос, чтобы быть немного более конкретно ..

Я мои контрольные точки представлены xPts и yPts. Теперь я хочу, чтобы получить очки, которые падают по сплайну, как это сделать, используя эти два вектора? Конструктор для CatmullRomSpline принимает Vector2, а не два float[]

ответ

3

что вы сделали. Залить пунктов:

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

Чтобы получить точку на кривой:

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

valueAt() Описание параметров:

1 (точка) точка вы ищете хранится в Вектор2.

  1. плавать между 0 и 1, 0 - первая точка, 1 последняя. 0.5f - средний. Этот поплавок представляет собой расстояние между отверстиями от первой до последней точки.

Получение и сделать 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)); 
    }