三次贝塞尔曲线,代入X求Y

Cpp初学者 2019-02-13 10:10:36
最近写个小游戏,有方块移动的动画,线性动画显得有些生硬,想用贝塞尔实现非线性动画。
如这个网址的图示:http://cubic-bezier.com/#.43,.04,.11,1.42

但是遇到个问题:
上面网站图示,是以x轴表示时间,y表示移动位置
查到的贝塞尔公式是:

问题1:公式中的t到底是啥?

看起来网站中图示和公式,好像一个是二维的,一个是一维的。

问题2:可不可以这么理解,上面网址图示,是两个贝塞尔公式的结果?

问题3(主要):我想如网站中图示,代入x值求出对应的y值。应该怎么做?求给个算法
我主要是想,分别代入0.1 0.2 0.3 ... 1.0,求出动画中方块的位置,10帧。
...全文
1214 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_ErDong 2020-10-10
  • 打赏
  • 举报
回复
验证了吗老哥?我目前也遇到这个问题了。

坐标点x公式 X(t) = (1-t)^3 * X1 + 3t(1-t)^2 * X2 + 3t^2(1-t) * X3 + T^3 * X4
坐标点Y公式 Y(t) = (1-t)^3 * Y1 + 3t(1-t)^2 * Y2 + 3t^2(1-t) * Y3 + T^3 * Y4

我觉得你这样效率应该不高,我的建议是把坐标带入贝塞尔方程里给解出来,只保留两个变量XY。这个公式出来了就好办了,直接带入X就能求出Y。

不知道这样子可行不。
shuice 2019-06-06
  • 打赏
  • 举报
回复 1
我正好遇到了同样的问题,搜索到了这个帖子,我想明白了 公式 p(t) = (1-t)^3 * P1 + 3t(1-t)^2 * P2 + 3t^2(1-t) * P3 + T^3 * P4的目的是用来绘制曲线的,t范围是[0-1], 比如当t=0.5的时候p(t)可能为(x=0.2, y=0.8) 楼主想知道的是当x=0.2的时候,求出y=0.8 因为公式 p(t) = (1-t)^3 * P1 + 3t(1-t)^2 * P2 + 3t^2(1-t) * P3 + T^3 * P4可以分为两个,分别是 坐标点x公式 X(t) = (1-t)^3 * X1 + 3t(1-t)^2 * X2 + 3t^2(1-t) * X3 + T^3 * X4 坐标点Y公式 Y(t) = (1-t)^3 * Y1 + 3t(1-t)^2 * Y2 + 3t^2(1-t) * Y3 + T^3 * Y4 根据坐标点x公式,带入X(t)=0.2,因为X1, X2, X3, X,4已知, 算一个一元三次方程 可以算出 t等于多少. 把t的值带入坐标点Y公式算出Y(t) 我还没有验证
NinjaYinJey 2019-02-18
  • 打赏
  • 举报
回复
例如: x = a, x1 = a1 bezier : |x + x1| = (x1 - x)(1 - t)^n + n(x1 - x)t^0 + ....... + (x1 - x)(1 - t)^(n - 1) + n(x1 - x)t^(n + 1) = P(x)
NinjaYinJey 2019-02-17
  • 打赏
  • 举报
回复
t --> 时间 比率 速率 密度 etc...... 贝塞尔曲线不是求点,而是求n的线性组合的方程。 x y --> x + y的线性组合。 贝塞尔方程和n维没有关系,它是独立的方程,所以不能通过x求出y。
schlafenhamster 2019-02-17
  • 打赏
  • 举报
回复
见:
三阶贝塞尔曲线Interpolator的应用
zgl7903 2019-02-16
  • 打赏
  • 举报
回复
Cpp初学者 2019-02-15
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
PolyBezier

您没有认真看我的描述吧?我不是需要画曲线,不是需要生存曲线,我需要,指定4个点的x值和y值,代入x值求出对应的y值
如图:
zgl7903 2019-02-14
  • 打赏
  • 举报
回复
zgl7903 2019-02-14
  • 打赏
  • 举报
回复
Cpp初学者 2019-02-14
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
贝塞尔曲线的数学原理

帖子我看了很多,还是没弄明白,可能是我数学基础不行,比较初中毕业没上了,大神能给个算法吗?
让用户可以随时查找曲线上任意点的坐标(函数值) 附件的 .mht文件,是一个简单介绍贝塞尔三次插值的文档,可以用IE打开,更多贝塞尔插值的算法,可以用搜索引擎找 附件的 .xls文件,打开以后,会看见三个工作表,分别演示了 找一个数值在曲线上的一组对应点 找一个数值在曲线上的所有对应点 和贝塞尔曲线是怎样在通过每两个节点的(每一对输入的X-Y数值代表平面坐标系的一个点,称为节点,Excel的平滑曲线通过每一个节点) 要在其他Excel文档使用 BezireInt() 函数,需要按Alt+F11,双击模块一 复制所有文字 然后打开其他Excel文档按Alt+F11,插入---模块,然后粘贴所有文字 自定义函数的使用方法是: 在空白单元格输入 =BezierInt(X坐标的范围,Y坐标的范围,待查的数值) 函数就会返回一个包含六个元素的数组,分别是三个点的X,Y坐标 如: 你根据 a1:a4的数值作为X值,b2:b4的数值作为Y值,画了一个平滑线散点图 想查找c1的数值是不是在这条曲线上 就可以输入 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,1) 得到曲线上第一个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,2) 得到曲线上第一个 X值=C1数值的点的Y坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,3) 得到第2个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,4) 得到第2个 X值=C1数值的点的Y坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,5) 得到第3个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,6) 得到第3个 X值=C1数值的点的Y坐标 如果有多段曲线上的点包含C1的数值,那么可以增加输入参数,指定从哪个节点开始查找 =Index( BezierInt(a1:a4,b1:b4,c1,3),1,1) 得到从第三组X-Y数据开始查找, 返回第一个符合C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1,3),1,2) 得到从第三组X-Y数据开始查找,返回第一个符合C1数值的点的Y坐标 函数默认输入数值是X值,要根据Y值找点的话,还可以增加输入参数, 指定输入的是Y值 =Index( BezierInt(a1:a4,b1:b4,c1,1,"Y"),1,1) 得到返回曲线上第一个 Y值=C1数值的点的X坐标如此类推......

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧