Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QPainter, QTransform и координаты


Автор: alammer 29.10.2014, 12:39
Здравствуйте! Объясните один момент:)

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); ), но  в хелпе ничего на эту тему не нашел. Чего я не понимаю?

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

Автор: alammer 29.10.2014, 13:16
за вычетом матрицы у меня на цикл рисования ушло около 2 минут

подскажите как проще/быстрее подсчитать координаты для произвольного количества окружностей?

Автор: Amp 29.10.2014, 22:32
Умножать радиус на синус и косинус текущего угла, очевидно же.

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

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

тему можно удалять

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)