Рисование пути Безье в XNA для Windows Phone 7 - PullRequest
2 голосов
/ 02 августа 2010

Я очень новичок в Windows Phone 7. Я пишу пример игры, в которой я хочу перемещать изображение случайным образом.

Обсуждая с одним из моих друзей, он сказал мне использовать путь Безье.Я ищу в сети, чтобы понять концепцию пути Безье.Похоже, это подойдет для моего решения.Но я не нашел ни одного примера кода, который будет это делать.

Пожалуйста, помогите мне найти образец.

Ответы [ 2 ]

8 голосов
/ 02 августа 2010

Путь Безье - верное решение вашей проблемы, но я мог бы предложить вместо него использовать сплайн Катмулла-Рома .Это далеко не так просто, потому что XNA уже включает функцию для генерации такого сплайна.Его также легче использовать (каждая контрольная точка также является точкой на сплайне).

Рассматриваемая функция имеет вид Vector2.CatmullRom (также существуют версии для Vector3 и дляплавает в MathHelper).Вы указываете четыре пункта.Средние два из которых действительны для вашего сплайна.Если вам нужно больше двух точек, просто переключайте входы по мере движения (второе становится первым, третье становится вторым и т. Д.).Аргумент amount определяет желаемую позицию вдоль пути.

Сплайн Catmull-Rom описан здесь, в Википедии .

И здесьинтерактивная демонстрация, показывающая, как работает сплайн .

1 голос
/ 03 октября 2012

Для простого рисования кривой Безье вы можете использовать это (для кубической кривой Безье ):

private Vector2 Bezier(int t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
    var x = OrdinateX((float)t / 100, p0, p1, p2, p3);
    var y = OrdinateY((float)t / 100, p0, p1, p2, p3);

    return new Vector2(x, y);
}

private float OrdinateX(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
    return (float)((Math.Pow((double)(1 - t), 3) * p0.Y) + (3 * Math.Pow((double)(1 - t), 2) * t * p1.X) + (3 * (1 - t) * (t * t) * p2.X) + ((t * t * t) * p3.X));
}

private float OrdinateY(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
    return (float)((Math.Pow((double)(1 - t), 3) * p0.Y) + (3 * Math.Pow((double)(1 - t), 2) * t * p1.Y) + (3 * (1 - t) * (t * t) * p2.Y) + ((t * t * t) * p3.Y));
}   

Итак, и в обновлении вы должны поставить это:

for (int t = 0; t <= 100; t++)
    object.position = Bezier(t, new Vector(0, 0), new Vector(100, 100), new Vector(300,300), new Vector(0, 300));

Но я думаю, что более простой способ получить кривую - использовать сплайн Кэтмулла-Рома, как писал Эндрю Рассел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...