如何计算SVG椭圆弧?

2 投票
1 回答
946 浏览
提问于 2025-04-17 09:20

我正在做一个自定义的pyQt SVG渲染器,需要一些帮助。这完全是数学方面的问题,所以你不需要用到任何API。

要计算SVG的椭圆弧,你需要两个半径 rxry;椭圆的旋转角度 x-axis-rotation(单位是度);large-arc-sweep-flag(值为1或0),它决定了弧是画大于180度还是小于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;还有一个弧长/扫掠长度,表示弧本身的长度。我该如何将SVG命令转换成 arcTo() 方法可以使用的格式呢?

来源: W3C SVG, QPainterPath

1 个回答

1

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

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

你提供的SVG链接在该部分的末尾有一个链接,标题为 “椭圆弧实现说明”,里面有一个关于如何转换端点参数化和中心参数化的公式。


注意,QPainterPath.arcTo的文档提到它的调用方式是

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

但是在描述中提到的不是arcLength,而是sweepLength

创建一个占据给定矩形的弧,从指定的起始角度开始,向逆时针方向延伸sweepLength度。

奇怪的是,它说sweepLength是以度数来测量的,而弧长在数学上通常是指距离。

尽管文档中使用了让人困惑的参数名“arclength”,我认为它想表达的是arcTo的最后一个参数是扫过的角度,Δθ。

所以如果你使用SVG实现说明中的公式来计算θ1和Δθ,我认为它们可以分别用来表示startAnglearcLength

撰写回答