crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 13.7.2025, 14:10