Вычисление с эллиптической дугой SVG? - PullRequest
2 голосов
/ 01 января 2012

Я работаю над пользовательским рендерером 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;и длина дуги / длина длины самой дуги.Как перевести команду SVG во что-то, что может использовать метод arcTo()?

Источники: W3C SVG , QPainterPath

1 Ответ

1 голос
/ 01 января 2012

В эллиптических дугах SVG используется «параметризация конечной точки».

QPainterPath.arcTo в дугах используется «параметризация центра».

Предоставленная вами ссылка SVG имеет ссылку в конце раздела, озаглавленную «Замечания по реализации эллиптической дуги» , которые дают формулы для преобразования между конечной точкой и параметризацией центра.


Обратите внимание, что документация QPainterPath.arcTo утверждает, что подпись вызова

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

, но вместо arcLength ее описание относится к sweepLength:

Создает дугу, занимающую данный прямоугольник, начиная спри указанном startAngle и расширении sweepLength градусов против часовой стрелки.

Как ни странно, это говорит о том, что sweepLength измеряется в градусах, тогда как длина дуги имеет обычное математическое значение, которое всегда равно расстоянию.

Несмотря на то, что в документации используется запутанное имя параметра «arclength», я думаю, что это означает, что последний аргумент arcTo is угол поворота, Δθ.

Так что, если вы используете формулы из заметок по реализации SVG для θ1, Δθ, я думаю, что они могут использоваться для startAngle и arcLength соответственно.

...