2011-03-30 53 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