首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Bezier曲线

实现Bezier曲线
EN

Stack Overflow用户
提问于 2011-03-30 20:16:33
回答 2查看 1.6K关注 0票数 1

我正在尝试为一个任务实现Bezier曲线。我试图通过给我的函数一个关键帧数组来移动球(使用bezier曲线)。该函数应该给出关键帧之间的所有帧...或者控制点。虽然我用的是wikipedia上的公式。它不是真的有效:s

这是我的代码:

代码语言:javascript
复制
  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);
}

此外,我还注意到frames[]数组应该更大,但我找不到其他更适合程序员的文本

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-31 02:12:57

终于得到了我想要的东西!下面是我所做的:

代码语言:javascript
复制
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;     
}

}

代码语言:javascript
复制
private void createInterpolationData() {
     time = keyFrames[keyFrames.length-1].time -
     keyFrames[0].time;
     noOfFrames = 60*time;
     partialTime = time/noOfFrames;
     frames = new Frame[ceil(noOfFrames)];  
}
票数 0
EN

Stack Overflow用户

发布于 2011-03-30 20:25:51

这里有很多东西看起来不太对劲。

  1. 这样做,插值将精确地通过第一个和最后一个控制点,而不是通过其他控制点。这是你想要的吗?,

  1. ,如果你有很多关键帧,你正在使用一个非常高的多项式来进行插值。高次多项式是出了名的糟糕,你可能会让你的位置在关键帧位置之间疯狂振荡。(这就是为什么问题1的答案可能是否的原因之一。)
  2. 为了便于论证,假设您确实想这样做,那么t的值应该从开始的0变为结束的1。你碰巧有1001个这样的关键帧吗?如果不是这样,你将做错误的thing.
  3. Evaluating这些多项式,并调用大量的factpow可能效率低下,特别是当n很大的时候。

在没有更多了解任务范围的情况下,我不愿详细介绍您应该做什么-- Stack Overflow为您做作业对任何人都没有好处!关于Bezier曲线,你已经被告知了什么?你的作业到底要求你做什么?

编辑后添加:

使用Bezier曲线进行插值的最简单方法可能是这样。在每对关键点之间有一条(三次) Bezier曲线。每条Bezier曲线的端点(第一个和最后一个控制点)就是这些关键点。你还需要两个控制点。要使运动在通过给定关键点时平滑,需要(关键点减去上一个控制点)=(下一个控制点减去关键点)。因此,您将在每个关键点选择一个向量,该向量将确定前一个控制点和后续控制点的位置。当您移动通过每个关键点时,您将沿着该向量的方向移动,并且向量越长,移动速度就越快。(如果向量为零,则立方Bezier将退化为简单的直线路径。)

选择该向量使所有东西看起来都很好是非常重要的,但在这个阶段,您可能并不是真的被要求这样做。因此,一些简单的东西可能就足够好了。例如,您可以将向量与(下一个关键点减去前一个关键点)成比例。如果你这样做,你需要在你的路径的开始和结束做一些不同的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5486134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档