Russian Qt Forum
Сентябрь 30, 2024, 20:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QT QPainter::drawArc  (Прочитано 7627 раз)
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);
    }

Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #1 : Январь 17, 2011, 19:57 »

Видно, однако, что и начальный угол - не 45, и длина дуги - не 90. Поэтому, вопрос - это bug QT или моя неправильная интерпретация?
Скорее всего для эллипса используется параметризация x=a*cos(t), y=b*sin(t). И под "углами" имеются ввиду значения параметра t. Для настоящих углов измеряемых относительно оси OX нужно пересчитывать занчения этих углов в значения для параметра t.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 17, 2011, 20:10 »

Нормальный результат, т.к. width / height (для rct) 2:1
Записан
Ubuntu_linux
Гость
« Ответ #3 : Январь 17, 2011, 22:24 »

Нормальный результат, т.к. width / height (для rct) 2:1
Действительно, все в порядке! Будет так как хочется когда будет квадрат.
Записан
AlexEx
Гость
« Ответ #4 : Январь 18, 2011, 10:14 »

Почему это происходит и как с этим бороться, это все понятно. Вопрос в том, что это - QT bug, который будет исправлен со временем (текущая реализация определенно вызывает вопросы), или это фича by design и на такое поведение можно полагаться и в дальнейшем. Похоже, надо прямо спрашивать QT-шную команду Улыбающийся.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #5 : Январь 18, 2011, 14:40 »

Вопрос в том, что это - QT bug, который будет исправлен со временем (текущая реализация определенно вызывает вопросы), или это фича by design и на такое поведение можно полагаться и в дальнейшем.
В Java2D и System.Drawing.Graphics такое же поведение при рисовании дуг, так что это скорее "фича by design".
Записан
AlexEx
Гость
« Ответ #6 : Январь 18, 2011, 15:02 »

Цитировать
В Java2D и System.Drawing.Graphics такое же поведение при рисовании дуг, так что это скорее "фича by design".
Спасибо. Собственно это и хотелось прояснить. Видимо, так принято считать углы для дуг. Хотел было сам попробовать на GDI+, но коль System.Drawing.Graphics делает также, то и пробовать нечего.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 23.