2012-01-01 63 views
1

我正在處理一個自定義的pyQt SVG渲染器,需要幫助。這純粹是數學的,所以你不需要API。使用SVG elipitical弧計算?

要計算SVG橢圓弧,您需要兩個半徑rxry;橢圓的旋轉角度爲x-axis-rotation;確定是否通過大於或小於180度畫圓弧並圍繞圓的圓弧方向的large-arc-sweep-flag(1或0); 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

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

+0

感謝您的鏈接,我使它超過了基本代數和三角函數,但這有點難以理解。邊界矩陣x = w-rx,y = h-ry,w = rx * 2,h = ry * 2。接下來希望搞清楚'startAngle'和'arcLength'。 – Christopher 2012-01-01 03:02:17

+0

感謝您的幫助。我只想問問某人如何將這些方程式轉換成python,但非常感謝你指引我朝着正確的方向發展。 – Christopher 2012-01-02 19:32:48