首页 > 解决方案 > 元素的 QPainterPath 百分比/t 值

问题描述

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

如果我想沿着路径找到一个特定的点,我可以使用该pointAtPercent方法。该文件指出

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

在此处输入图像描述

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

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

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

标签: python-2.7qtpyqtpyqt4

解决方案


t沿 total 缩放length(),但您也可以知道各个段的长度,从而t进行相应的调整。路径的元素是一个相当具体的术语:每个 3 个元素cubicTo,假设没有中间位置变化。像您这样的任意路径由 a MoveToElement, CurveToElement, two CurveToDataElements, another CurveToElement, another two 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

推荐阅读