crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Как рисовать из объекта QImage по окружности?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
lanz Дата 12.3.2013, 8:22
  Попробуйте заранее подготовить несколько картинок, например в массиве.
Если торможение пропадет, значит дело в подготовке картинки, если останется, в чем то другом.
zuze Дата 11.3.2013, 15:00
 
Цитата(lanz @ 11.3.2013, 14:40) *
Торможение скорей всего из-за подготовки следующей картинки.


if (static_cast<int>((this->MyRadianToGradus(phi)+0.5)) < 360)
   phi += this->MyGradusToRadian(6.0);
else
  phi = 0.0;


Скажите пожалуйста, если линия когда доходит до 360 градусов, претормаживает, это может быть в следствии вот этого части кода?

...
...
else
  phi = 0.0;


Если да, то как правильно переделать код?
lanz Дата 11.3.2013, 14:40
  Можно попробовать картинку готовить не в Format_ARGB32, а Format_ARGB32_Premultiplied.
Торможение скорей всего из-за подготовки следующей картинки. Если их немного, можно заранее подготовить.
zuze Дата 11.3.2013, 10:11
  В принципе задача решена.

Цитата(lanz @ 11.3.2013, 9:22) *
Скорее всего this->MyRadianToGradus(phi) становится больше 360.


Изменил так и это заработало:

QBrush brush_im1(im1);
QBrush brush_im2(im2);
QTransform tr;
tr.translate (-492, -492);
brush_im1.setTransform (tr);
brush_im2.setTransform(tr);

Tochka.translate(542, 512);
Tochka.rotate(-90);

QRect rectangle(-492, -492, 984, 984);
Tochka.setBrush(brush_im2);
Tochka.drawPie(rectangle, 0, -static_cast<int>(this->MyRadianToGradus(phi)+0.5)*16);

Tochka.setBrush(brush_im1);
Tochka.drawPie(rectangle, -static_cast<int>(this->MyRadianToGradus(phi)+0.5)*16, static_cast<int>((this->MyRadianToGradus(phi)+0.5) - 360)*16);


Единственное, что плохо, что линия которая рисуеться также по кругу почему-то после первого рисунка, когда рисуется первый и второй рисунок скорость вращения линии падает. В добавок, когда линия доходит до 360 градусов линия не надолго притормаживает.
lanz Дата 11.3.2013, 9:22
  Скорее всего this->MyRadianToGradus(phi) становится больше 360.
Вообще интересно скриншот посмотреть.
zuze Дата 11.3.2013, 9:01
 
Цитата(lanz @ 11.3.2013, 8:24) *
Переставляем местами 360 и phi, чтобы рисовалось по часовой.


Поправил, это заработало, теперь остаётся маленькая проблема в момент когда отрисовка доходит до 360 градусов происходит, на очень кароткое время отрисовка какой-то картинки, то ли её сдвиг. Этого не должно быть, так как когда прошла отрисовка 1 и 2 картинки, должа рисоваться 2 и 3 и не каких посторонних эффектов не должно быть.
lanz Дата 11.3.2013, 8:24
 
Tochka.drawPie(rectangle, -this->MyRadianToGradus(phi)*16, -this->MyRadianToGradus(phi)*16);


Зде сь второе значение - это величина угла который будет отрисовываться.
Со стартовым углом все правильно, а spanAngle должен дополнять до 360.
Tochka.drawPie(rectangle, -this->MyRadianToGradus(phi)*16, (this->MyRadianToGradus(phi) - 360)*16);

Переставляем местами 360 и phi, чтобы рисовалось по часовой.

zuze Дата 11.3.2013, 7:57
  А как теперь сделать, что бы с права от линии рисовалась первая картинка, а слева от линии вторая картинка?

Я пробовал так:

QImage im1(985, 985, QImage::Format_ARGB32);
QImage im2(985, 985, QImage::Format_ARGB32);

QBrush brush_im1(im1);
QBrush brush_im2(im2);
QTransform tr;
tr.translate (-492, -492);
brush_im1.setTransform (tr);
brush_im2.setTransform(tr);

Tochka.translate(542, 512);
Tochka.rotate(-90);

QRect rectangle(-492, -492, 984, 984);
Tochka.setBrush(brush_im1);
Tochka.drawPie(rectangle, 0, -this->MyRadianToGradus(phi)*16);

Tochka.setBrush(brush_im2);
Tochka.drawPie(rectangle, -this->MyRadianToGradus(phi)*16, -this->MyRadianToGradus(phi)*16);


Первая картинка рисуетсья с нуля, а другую вообще не видно, а должна от линии рисоваться с права. Потом рисуеться и следующие картинки, но они не совпадают с крутсящайся линией, затем опять почему-то одна картнинка с нуля рисуется.

Как же нужно правильно сдклать?
lanz Дата 6.3.2013, 16:30
  Это требование функции drawPie.
Цитата
The startAngle and spanAngle must be specified in 1/16th of a degree, i.e. a full circle equals 5760 (16 * 360).

Цитата
startAngle и spanAngle должны задаваться в 16тых частях градуса, т.е. полный круг - 5760 (360*16).
zuze Дата 6.3.2013, 15:40
 
Цитата(zuze @ 19.2.2013, 13:50) *
Теперь нужно кисть передвинуть обратно, чтобы она попала центром в центр координат, как то так:


Большое спасибо, заработало, толко в место

Tochka.rotate(180);


Надо было написать:

Tochka.rotate(-90);


А Вы могли бы обяснить за чем мы -this->MyRadianToGradus(phi) умножаем на 16? Как я понял надо умножать на 16, что бы скорость картинки рисовалась одинаково со скоростью рисования линии.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 17:24