2011-03-30 76 views
0

我想實現一個分配Bezier曲線。我試圖通過給我的函數一個關鍵幀數組移動一個球(使用bezier曲線)。該功能應該給我關鍵幀之間的所有幀...或控制點...但儘管我使用wikipedia上找到的公式...它不是真的工作:s實現Bezier曲線

她是我的代碼:

private void interpolate(){ 
     float x,y,b, t = 0; 
     frames = new Frame[keyFrames.length]; 
     for(int i =0;i<keyFrames.length;++i){ 
     t+=0.001; 
     b = Bint(i,keyFrames.length,t); 
     x = b*keyFrames[i].x; 
     y = b*keyFrames[i].y; 
     frames[i] = new Frame(x,y);  
     } 
    } 

private float Bint(int i, int n, float t){ 
    float Cni = fact(n)/(fact(i) * fact(n-i)); 
    return Cni * pow(1-t,n-i) * pow(t,i); 
} 

而且我注意到,幀[]數組要大得多,但我無法找到任何其他文字這是比較友好的程序員

在此先感謝。

+0

您使用什麼語言? – Blorgbeard 2011-03-30 12:18:48

+0

[Processing] http://processing.org/它是基於Java的,但是Frame類和KeyFrame類都是我的創建。 (他們真的只是一個x,y的位置和時間字段,我沒有在這個代碼中使用 – Jonny 2011-03-30 12:22:36

回答

0

終於有了我需要的東西!下面是我所做的:

private void interpolate() {  
    float t = 0; 
    float x,y,b; 
    for(int f =0;f<frames.length;f++) {  
    x=0; 
    y=0; 
    for(int i = 0; i<keyFrames.length; i++) {  
     b = Bint(i,keyFrames.length-1,map(t,0,time,0,1)); 
     x += b*keyFrames[i].x; 
     y += b*keyFrames[i].y; 
    }  
    frames[f] = new Frame(x,y); 
    t+=partialTime;  
} 

}

private void createInterpolationData() { 
    time = keyFrames[keyFrames.length-1].time - 
    keyFrames[0].time; 
    noOfFrames = 60*time; 
    partialTime = time/noOfFrames; 
    frames = new Frame[ceil(noOfFrames)]; 
} 
+0

這與原始問題中的代碼基本相同,並且具有與我在第3節(它修復的問題)之外的答案中提到的相同的缺點。但是,如果它滿足您的需求,就夠公平了。 – 2012-06-08 12:18:24

1

有很多事情看起來似乎不是十分正確的位置。

  1. 這樣做,您的插值將完全通過第一個和最後一個控制點,但不通過其他控制點。那是你要的嗎?

  2. 如果你有大量關鍵幀,您使用的是您的插值非常高的多項式。高度的多項式是出了名不好,乖,你可能會得到你的位置在關鍵幀位置之間瘋狂振盪。 (這就是爲什麼回答問題1也許應該是沒有。)

  3. 假設爲參數的緣故,你真的要做到這一點,你的t值應該從0起步到1最後。你碰巧有1001個關鍵幀?否則,你會做錯事。

  4. 評估這些多項式有很多電話來factpow很可能是低效的,特別是如果n大。

我不願意去到很多細節你應該做什麼不知道更多關於你的任務的範圍 - 它會做任何人都沒有好處堆棧溢出做功課你!你已經被告知了關於貝塞爾曲線的內容?你的任務到底要求你做什麼?

編輯補充:

做用貝塞爾曲線插補最簡單的方法大概是這樣的。在每對關鍵點之間有一條(三次)貝塞爾曲線。每條貝塞爾曲線的端點(第一個和最後一個控制點)都是這些關鍵點。你需要兩個控制點。爲了使運動在通過給定關鍵點時保持平滑,您需要(關鍵點減去上一個控制點)=(下一個控制點減去關鍵點)。所以,你選擇在每個關鍵點一個載體,這將決定在之前和之後的控制點去。當你通過每個關鍵點移動,你會在矢量的方向移動,而較長的向量是你會被感動得更快。 (如果矢量爲零,那麼你的三次Bezier退化爲一條簡單的直線路徑。)

選擇這個矢量,使一切看起來不錯很不平凡,但你可能並沒有真的被要求這樣做在這個階段。所以很簡單的事情可能會足夠好。例如,您可以使矢量與(下一個關鍵點減去之前的關鍵點)成比例。如果你這樣做,你需要在路徑的開始和結束時做一些有點不同的事情。

+0

我不想讓你爲我做我的功課。基本上我們有一個 題目叫做動畫我們在那裏我們簡要地介紹了線性插值,三次樣條曲線,cutmul rom和貝塞爾曲線,然後我們在那裏被要求實現它們,這就是我得到的所有信息 然而,我更傾向於編程,而不是數學,儘管在維基百科上發現的公式很直截了當我並不完全明白_t_是什麼? – Jonny 2011-03-30 12:34:46

+0

甚至可能是一些程序員友好的教程,或者是我所要求的所有東西我通常爲我的程序感到自豪,並且喜歡接受新的挑戰,但我認爲我't hit my head or something。 – Jonny 2011-03-30 12:38:11

+0

你可以把't'看作是一個時間值,參數化曲線上的運動。在't = 0'你處於冷杉st控制點。在't = 1'你是最後一個控制點。在這兩者之間,你的移動方式受其他控制點的控制,但不一定(或者甚至通常)通過其中任何一個控制點。 – 2011-03-30 12:40:47