Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AlexEx от Январь 17, 2011, 13:54



Название: Вопрос по QT QPainter::drawArc
Отправлено: AlexEx от Январь 17, 2011, 13:54
Потребовалось вывести дугу и оказалось, что мои представления о параметрах метода QPainter::drawArc не совпадают с полученными результатами. Мануал говорит, что получаемая дуга - часть эллипса, вписанного в прямоугольник, а начальный угол дуги и ее длина задаются в градусах, помноженных на 16. 0-й угол соответствует 3-м часам. Ниже - метод, выводящий по задумке дугу эллипса длиной 90 градусов, начиная с 45-го градуса (на аттаче - зеленого цвета). Видно, однако, что и начальный угол - не 45, и длина дуги - не 90. Поэтому, вопрос - это bug QT или моя неправильная интерпретация?
Код:
 void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);

        QPen blackpen( Qt::black );
        blackpen.setWidth(1);
        QPen greenpen( Qt::green );
        blackpen.setWidth(1);

        QBrush br( Qt::white );

        painter.setPen(blackpen);
        painter.setBrush(br);
        painter.drawRect(QRect(50, 50, 200, 200));
        painter.setPen(greenpen);
        QRect rct(50, 100, 200, 100);
        painter.drawRect(rct);
        painter.setPen(blackpen);
        painter.drawLine(50, 50, 250, 250);
        painter.drawLine(50, 250, 250, 50);
        painter.drawLine(50, 150, 250, 150);
        painter.setPen(greenpen);
        painter.drawLine(150, 150, 250, 100);
        painter.drawLine(150, 150, 50, 100);
        painter.drawArc(rct, 45 * 16, 90 * 16);
    }



Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: kamre от Январь 17, 2011, 19:57
Видно, однако, что и начальный угол - не 45, и длина дуги - не 90. Поэтому, вопрос - это bug QT или моя неправильная интерпретация?
Скорее всего для эллипса используется параметризация x=a*cos(t), y=b*sin(t). И под "углами" имеются ввиду значения параметра t. Для настоящих углов измеряемых относительно оси OX нужно пересчитывать занчения этих углов в значения для параметра t.


Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: Igors от Январь 17, 2011, 20:10
Нормальный результат, т.к. width / height (для rct) 2:1


Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: Ubuntu_linux от Январь 17, 2011, 22:24
Нормальный результат, т.к. width / height (для rct) 2:1
Действительно, все в порядке! Будет так как хочется когда будет квадрат.


Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: AlexEx от Январь 18, 2011, 10:14
Почему это происходит и как с этим бороться, это все понятно. Вопрос в том, что это - QT bug, который будет исправлен со временем (текущая реализация определенно вызывает вопросы), или это фича by design и на такое поведение можно полагаться и в дальнейшем. Похоже, надо прямо спрашивать QT-шную команду :).


Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: kamre от Январь 18, 2011, 14:40
Вопрос в том, что это - QT bug, который будет исправлен со временем (текущая реализация определенно вызывает вопросы), или это фича by design и на такое поведение можно полагаться и в дальнейшем.
В Java2D и System.Drawing.Graphics такое же поведение при рисовании дуг, так что это скорее "фича by design".


Название: Re: Вопрос по QT QPainter::drawArc
Отправлено: AlexEx от Январь 18, 2011, 15:02
Цитировать
В Java2D и System.Drawing.Graphics такое же поведение при рисовании дуг, так что это скорее "фича by design".
Спасибо. Собственно это и хотелось прояснить. Видимо, так принято считать углы для дуг. Хотел было сам попробовать на GDI+, но коль System.Drawing.Graphics делает также, то и пробовать нечего.