Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QPainter, QTransform и координаты 
V
    Опции темы
alammer
Дата 29.10.2014, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.12.2012

Репутация: нет
Всего: нет



Здравствуйте! Объясните один момент:)

Qt 4.8.1, Ubuntu 12.04
Мне надо нарисовать X кружков, а потом соединить их линиями по некоторму алгоритму. Для рисования окружностей я использую painter.rotate().  А для того, чтобы потом иметь их координаты в общей системе влепил костыль на QTransform. Про QTransform прочитал вскользь в хелпах. Костыль заработал почти с 1 раза, но я теперь не понимаю как:) Вот кусок кода:

            
Код
QPainter painter(this);

            painter.translate(wid / 2, hei / 2);  // переместились в центр окна

            recsize = 10;//tplist[ap0].remac.size();  //количество кружков

            rot = 360 / recsize;

            painter.save();

            for (int i = 0; i < recsize; i++)
            {
               
                if (i > 0)painter.rotate(rot);

                br.setColor(Qt::green);
                painter.setPen(Qt::NoPen);
                painter.setBrush(br);
                cent = QPoint::QPoint(0, -hei*0.375);  //центр окружности в тек. координатах (после rotate())
                painter.drawEllipse(cent, hei/30, hei/30);

                QTransform mytrans;             
                mytrans.rotate(rot*i);
                QPoint trpp = QPoint::QPoint(0,-hei*0.375);    //это координаты центра текущей окружности в текущих координатах
                QPoint trpOLD = mytrans.map(trpp);    // в trpOLD оказывается  тот же самый центр но уже в начальных координатах ???        
            }


получается, что QTransform::map() преобразовывает текущие коор-ты матрицы сразу в начальные коор-ты (т.е. в систему с центром painter.translate(wid / 2, hei / 2); ), но  в хелпе ничего на эту тему не нашел. Чего я не понимаю?

Это сообщение отредактировал(а) alammer - 29.10.2014, 12:40
PM MAIL   Вверх
Amp
Дата 29.10.2014, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Зачем тебе вообще понадобились трансформации для рисования кругов вдоль окружности? Не проще было ручками посчитать координаты центров в зависимости от угла и радиуса?

Это сообщение отредактировал(а) Amp - 29.10.2014, 13:04
PM MAIL   Вверх
alammer
Дата 29.10.2014, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.12.2012

Репутация: нет
Всего: нет



за вычетом матрицы у меня на цикл рисования ушло около 2 минут

подскажите как проще/быстрее подсчитать координаты для произвольного количества окружностей?
PM MAIL   Вверх
Amp
Дата 29.10.2014, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Умножать радиус на синус и косинус текущего угла, очевидно же.
PM MAIL   Вверх
math64
Дата 30.10.2014, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Все окружности рисуются одним пером и закрашиваются одной кистью?
Используй QPainterPath - вычисляется один раз, если изменилсь высота/ширина.
Если цвета разные, для каждого цвета отдельный QPainterPath.
С синусами и косинусами возиться не надо. Исплользуй QTransform.

PM   Вверх
alammer
Дата 30.10.2014, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.12.2012

Репутация: нет
Всего: нет



всем спасибо, оказалось, что rotate QPainter-a и rotate Qtransformer-a по умолчанию вращают в противоположные стороны, отсюда и возникала необходимая компенсация

тему можно удалять
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1079 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.