2010-08-02 61 views
2

我對Windows Phone 7非常陌生。我正在編寫一個示例遊戲,我希望隨機移動圖像。在XNA中爲Windows Phone 7繪製貝塞爾路徑

在與我的一位朋友討論時,他告訴我使用Bezier路徑。我在網上搜索瞭解貝塞爾路徑概念。它看起來會適合我的解決方案。但我沒有找到任何可以做到這一點的示例代碼。

請幫我找到樣品。

回答

8

Bezier路徑是解決您的問題的有效方法,但我可能會建議使用Catmull-Rom樣條代替。實施起來非常方便,尤其是因爲XNA 已經包含了一個用於生成這樣的樣條函數的函數。它也更容易使用(每個控制點也是樣條曲線上的一個點)。

有問題的功能是Vector2.CatmullRomVector3也有版本,MathHelper也有浮動版本)。你指定四點。其中的中間兩個對您的樣條有效。如果您需要兩點以上的點數,只需在移動時循環輸入(第二點變爲第一點,第三點變爲第二點,依此類推)。沿着路徑,amount論點描述了你想要的位置。

The Catmull-Rom spline is described here on Wikipedia

here is an interactive demo showing how the spline works

1

貝塞爾曲線的簡單的抽籤,你可以使用這個(爲cubic Bezier curve):那麼,在更新

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)); 

但我認爲,更容易獲得曲線的方法是使用Catmull-Rom樣條,Andrew Russell如何寫。