我有一个QPainterPath,它有两个元素,都是三次贝塞尔曲线,如下所示:
如果我想在路径上找到特定点,我可以使用pointAtPercent
方法。文件说明了这一点
当存在曲线时,百分比参数被映射到贝塞尔方程的t参数。
当我得到百分比时,它沿着整个路径的长度从0到1。例如,该中间控制点在t = 0.46,而实际上它是左元素的结束(t = 1.0)和下一个元素的开始(t = 0)。所以在我的图像中如果我得到绿色圆圈的百分比,它将在0.75左右。我想要的是获得绿色圆圈的0.5,即第二个Bezier的百分比。
所以我的问题是,在Qt中有没有办法确定给定Element的百分比值而不是相对于整个路径长度?在我的例子中,我碰巧知道中间控制点的百分比值,但总的来说我不会知道它,所以我不能只是缩放百分比或假设均匀分布。
如果重要的话,我正在使用PyQt4(Qt 4.8)。谢谢!
t
沿着总length()
缩放,但你也可以知道各个段的长度,从而相应地调整t
。路径的元素是一个相当具体的术语:假设没有中间位置变化,每个cubicTo
有3个元素。像你的任意路径由MoveToElement
,CurveToElement
,两个CurveToDataElement
s,另一个CurveToElement
,另外两个CurveToDataElement
s组成。你必须迭代元素并提取第一个立方体的长度,以调整t
。
提取第一个立方体,确定其长度,然后使用它从t2
计算t
的函数看起来类似于(未经测试):
def t2(path, t):
if path.elementCount() != 7:
raise ValueError('invalid path element count')
path1 = QPainterPath()
path1.moveTo(path.elementAt(0))
path1.cubicTo(path.elementAt(2), path.elementAt(3), path.elementAt(1))
l = path.length()
l1 = path1.length()
l2 = l - l1
t2 = (t*l - l1)/l2
return t2