Element的QPainterPath百分比/ t值

问题描述 投票:1回答:1

我有一个QPainterPath,它有两个元素,都是三次贝塞尔曲线,如下所示:

如果我想在路径上找到特定点,我可以使用pointAtPercent方法。文件说明了这一点

当存在曲线时,百分比参数被映射到贝塞尔方程的t参数。

enter image description here

当我得到百分比时,它沿着整个路径的长度从0到1。例如,该中间控制点在t = 0.46,而实际上它是左元素的结束(t = 1.0)和下一个元素的开始(t = 0)。所以在我的图像中如果我得到绿色圆圈的百分比,它将在0.75左右。我想要的是获得绿色圆圈的0.5,即第二个Bezier的百分比。

所以我的问题是,在Qt中有没有办法确定给定Element的百分比值而不是相对于整个路径长度?在我的例子中,我碰巧知道中间控制点的百分比值,但总的来说我不会知道它,所以我不能只是缩放百分比或假设均匀分布。

如果重要的话,我正在使用PyQt4(Qt 4.8)。谢谢!

python-2.7 qt pyqt pyqt4
1个回答
1
投票

t沿着总length()缩放,但你也可以知道各个段的长度,从而相应地调整t。路径的元素是一个相当具体的术语:假设没有中间位置变化,每个cubicTo有3个元素。像你的任意路径由MoveToElementCurveToElement,两个CurveToDataElements,另一个CurveToElement,另外两个CurveToDataElements组成。你必须迭代元素并提取第一个立方体的长度,以调整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
© www.soinside.com 2019 - 2024. All rights reserved.