QPainterPath percentage/t 元素的值

QPainterPath percentage/t value for Element

我有一个 QPainterPath,它有两个元素,它们都是三次贝塞尔曲线,像这样:

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

When curves are present the percentage argument is mapped to the t parameter of the Bezier equations.

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

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

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

t 沿总 length() 缩放,但您也可以知道各个片段的长度,从而相应地调整 t。路径的 元素 是一个相当具体的术语:每个 cubicTo 有 3 个元素,假设中间位置没有变化。像你这样的任意路径由一个 MoveToElementCurveToElement、两个 CurveToDataElement、另一个 CurveToElement、另外两个 CurveToDataElement 组成。您必须迭代元素并提取第一个立方体的长度,以调整 t.

一个函数提取第一个立方体,确定它的长度,然后用它从 t 计算 t2 看起来类似于(未测试):

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