You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt中贝塞尔曲线给定X坐标求Y坐标的计算修正问题

修正Qt贝塞尔曲线指定X坐标对应Y值的计算方法

你的问题核心是混淆了贝塞尔曲线的参数t和实际X坐标的关系:Qt绘制的三次贝塞尔曲线是基于参数t∈[0,1]生成的,X坐标是t的三次函数(而非线性对应),直接用X=0.5代替t代入计算,自然会忽略手柄X位置对曲线的影响。

正确计算步骤

三次贝塞尔曲线的四个控制点为:P0(起点)、P1(左手柄)、P2(右手柄)、P3(终点),参数方程为:

X(t) = (1-t)³P0.x + 3(1-t)²tP1.x + 3(1-t)t²P2.x + t³P3.x
Y(t) = (1-t)³P0.y + 3(1-t)²tP1.y + 3(1-t)t²P2.y + t³P3.y

要得到X=0.5对应的Y值,需要分两步:

1. 解方程找到对应t值

将X=0.5代入X(t)的方程,整理为关于t的三次方程:

a*t³ + b*t² + c*t + d = 0

其中系数计算:

a = P3.x - 3*P2.x + 3*P1.x - P0.x
b = 3*P2.x - 6*P1.x + 3*P0.x
c = 3*P1.x - 3*P0.x
d = P0.x - 0.5

由于三次方程解析解繁琐,推荐用牛顿迭代法求t∈[0,1]范围内的实根:

  • 初始化t的初始值(若曲线X单调,可设为0.5;若有极值,需先找极值点缩小范围)
  • 迭代公式:
    f(t) = a*t³ + b*t² + c*t + d
    f’(t) = 3*a*t² + 2*b*t + c
    t_next = t_current - f(t_current)/f’(t_current)
    
  • 迭代至t_next与t_current的差值小于阈值(如1e-6),得到近似t值。

2. 代入Y(t)计算Y坐标

将求得的t值代入Y(t)公式,即可得到X=0.5对应的Y值:

double t = 迭代得到的根;
double y = qPow(1-t,3)*P0.y() + 3*qPow(1-t,2)*t*P1.y() + 3*(1-t)*qPow(t,2)*P2.y() + qPow(t,3)*P3.y();

注意事项

  • 若曲线存在自交或X(t)在[0,1]内有多个t对应X=0.5,需根据业务需求选择对应根(如第一个/最后一个交点)
  • 牛顿迭代需处理收敛问题,若初始值不收敛,可先计算X(t)在t=0、t=1及极值点的X值,确定根的数量和范围

内容的提问来源于stack exchange,提问作者Summit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:54:51