crossplatform.ru

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

8 страниц V  « < 4 5 6 7 8 >  
Ответить в данную темуНачать новую тему
> Как рисовать из объекта QImage по окружности?
lanz
  опции профиля:
сообщение 5.3.2013, 15:46
Сообщение #51


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


QImage im1(984, 984, QImage::Format_ARGB32);

Добавьте еще пиксель, пусть будет 985 на 985.
492+492 = 984, что выходит за границу картинки, т.к. индексы пикселей начинаются с 0.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 5.3.2013, 16:02
Сообщение #52


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 5.3.2013, 15:46) *
Добавьте еще пиксель, пусть будет 985 на 985.
492+492 = 984, что выходит за границу картинки, т.к. индексы пикселей начинаются с 0.


Понятно, большое спасибо, ошибка пропала.
Теперь нажо всё это правильно вывести.

Я пытался так:

Tochka.drawImage(0, 0, im1, 0, 0, im1.width(), im1.height());


Но на экране картинка вообще не появляется. Что здесь не так?

Сообщение отредактировал zuze - 5.3.2013, 16:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.3.2013, 16:11
Сообщение #53


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Приложите полностью код paintEvent и подготовки картинки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 6.3.2013, 8:50
Сообщение #54


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 5.3.2013, 16:11) *
Приложите полностью код paintEvent и подготовки картинки.


Прошу прощения, вчера не успел ответить, так как закончился рабочий день. Сейчас всё напишу.


Глобальные переменные

double polarisx = 0.0, polarisy = 0.0;
QImage im1(985, 985, QImage::Format_ARGB32);


В таймере

polarisx = 492 + 492 * sin(phi);
polarisy = 492 + 492 * -cos(phi);

for (int j = 0; j < 720; j++)
{
     for (int i = 491; i >= 0; i--)
     {
          buffer[i][j] = getc(fp);
          im1.setPixel(polarisx, polarisy, QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba());
      }
}


В paintEvent только

QPainter Tochka;
Tochka.begin(this);
Tochka.translate(542, 20);
Tochka.drawImage(0, 0, im3, 0, 0, im1.width(), im1.height());
Tochka.end();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 6.3.2013, 9:16
Сообщение #55


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Это должно быть не в таймере, это надо сделать один раз, например после загрузки файла, кроме того
polarisx и polarisy должны зависеть от i и j:
for (int j = 0; j < 720; j++)
{
     for (int i = 491; i >= 0; i--)
     {
          polarisx = 492 + i * sin(GradToRadian(j/2));
          polarisy = 492 + i * -cos(GradToRadian(j/2));
          buffer[i][j] = getc(fp);
          im1.setPixel(polarisx, polarisy, QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba());
      }
}


Почему используется im3 вместо im1?
Tochka.drawImage(0, 0, im3, 0, 0, im1.width(), im1.height())
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 6.3.2013, 9:31
Сообщение #56


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 6.3.2013, 9:16) *
Почему используется im3 вместо im1?


Ой, прошу прощения, это моя опечатка.

Цитата(lanz @ 6.3.2013, 9:16) *
Это должно быть не в таймере, это надо сделать один раз, например после загрузки файла, кроме того
polarisx и polarisy должны зависеть от i и j


Я сделал как Вы сказали, картинка появилась, только к сожалению не по частям а сразу вся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 6.3.2013, 10:26
Сообщение #57


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Теперь надо в таймере рисовать увеличивающийся пирог, установив в качестве brush созданную картинку.
QRectF rectangle(-492, -492, 984, 984);
int startAngle = 0 * 16;
int spanAngle = RadianToGrad(phi) * 16;

Tochka.setBrush (QBrush (im1));
Tochka.drawPie(rectangle, startAngle, spanAngle);

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 6.3.2013, 11:10
Сообщение #58


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 6.3.2013, 10:26) *
Теперь надо в таймере рисовать увеличивающийся пирог, установив в качестве brush созданную картинку.


QRect rectangle(0, 0, 984, 984);
Tochka.setBrush (QBrush (im1));
Tochka.drawPie(rectangle, 0, this->MyRadianToGradus(phi));


Но рисуеться почему-то с 90 градусов и противочасовой стрелке, а должно быть от 0 и по часовой стрелке. Я хотел использовать phi, а не вычислять заного, так как мне надо что бы картинка рисовалась, так же как меняется линия, которая ходит по кругу с тойже скорость.

Сообщение отредактировал zuze - 6.3.2013, 11:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 6.3.2013, 11:44
Сообщение #59


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Поверните систему координат, так же как вы делали раньше
transformation.rotate(180);

Для обратного вращения нужно поменять знак
Tochka.drawPie(rectangle, 0, -this->MyRadianToGradus(phi));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 6.3.2013, 13:35
Сообщение #60


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 6.3.2013, 11:44) *
Для обратного вращения нужно поменять знак

Tochka.drawPie(rectangle, 0, -this->MyRadianToGradus(phi));


Тут всё прекрасно сработало.

Цитата(lanz @ 6.3.2013, 11:44) *
Поверните систему координат, так же как вы делали раньше

transformation.rotate(180);


Сделал так:

QPainter Tochka;
QTransform transformation;
Tochka.begin(this);

Tochka.translate(50, 20);
transformation.rotate(180);
Tochka.setTransform(transformation);

QRect rectangle(0, 0, 984, 984);
Tochka.setBrush (QBrush (im1));
Tochka.drawPie(rectangle, 0, -this->MyRadianToGradus(phi));

Tochka.end();


И у меня перестал отобоажаться картинка вообще. Почему так произошло?

Сообщение отредактировал zuze - 6.3.2013, 13:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

8 страниц V  « < 4 5 6 7 8 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 4:25