我正在开发一个自定义的pyQt SVG渲染器并需要帮助。这纯粹是数学的,因此您不需要API。
要计算SVG椭圆弧,您需要两个半径rx
和ry
;椭圆的旋转程度为x-axis-rotation
; large-arc-sweep-flag
(1或0)确定是否通过大于或小于180度绘制弧线以及围绕圆弧的弧形方向; sweep-flag
(1或0)确定弧是否以负方向或正方向绘制;最终的x
和y
值决定了弧的结束。
但是,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 SVG, QPainterPath
答案 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,Δθ我认为它们可以分别用于startAngle
和arcLength
。