用SVG椭圆弧计算?

时间:2012-01-01 01:01:23

标签: python python-3.x pyqt4

我正在开发一个自定义的pyQt SVG渲染器并需要帮助。这纯粹是数学的,因此您不需要API。

要计算SVG椭圆弧,您需要两个半径rxry;椭圆的旋转程度为x-axis-rotation; large-arc-sweep-flag(1或0)确定是否通过大于或小于180度绘制弧线以及围绕圆弧的弧形方向; sweep-flag(1或0)确定弧是否以负方向或正方向绘制;最终的xy值决定了弧的结束。

但是,QPainterPath.arcTo(self, float x, float y, float w, float h, float startAngle, float arcLenght)使用了一个边界矩形x, y, w, h;起始角度startAngle;和arcLength / sweepLength弧本身的长度。如何将SVG命令转换为arcTo()方法可以使用的内容?

来源: W3C SVGQPainterPath

1 个答案:

答案 0 :(得分:1)

SVG椭圆弧使用“端点参数化”。

QPainterPath.arcTo弧使用“中心参数化”。

您提供的SVG链接在该部分末尾附近有一个链接 "Elliptical arc implementation notes"在端点和中心参数化之间提供formulas for the conversion


请注意,QPainterPath.arcTo documentation表示呼叫签名为

QPainterPath.arcTo (self, QRectF rect, float startAngle, float arcLength)

,而不是arcLength,其描述是指sweepLength

  

创建一个占据给定矩形的弧,从   指定startAngle并扩展sweepLength度   逆时针旋转。

奇怪的是,它表示sweepLength是以度为单位测量的,而arclength具有传统的数学意义,它始终是一个距离。

尽管文档使用了令人困惑的参数名称“arclength”,但我认为这意味着arcTo的最后一个参数是扫描角度Δθ。

因此,如果您使用SVG实现说明中的公式 θ1,Δθ我认为它们可以分别用于startAnglearcLength