Russian Qt Forum

Qt => Общие вопросы => Тема начата: BuRn от Май 28, 2012, 20:19



Название: колебание буквы
Отправлено: BuRn от Май 28, 2012, 20:19
Здравствуйте. Требуется отрисовать определенные буквы в определенном месте, что подскажете , я так думаю создать объект буквы, только вот как ее колебать и отрисовать на форме понятия не имею. Натолкните на идею


Название: Re: колебание буквы
Отправлено: Igors от Май 28, 2012, 21:17
Так напечатали исходную букву(ы) в QImage - и там ее колебите сколько хотите  :)


Название: Re: колебание буквы
Отправлено: BuRn от Май 28, 2012, 21:47
Так напечатали исходную букву(ы) в QImage - и там ее колебите сколько хотите  :)
дык а как колебать QImage


Название: Re: колебание буквы
Отправлено: Igors от Май 29, 2012, 08:53
дык а как колебать QImage
Да как угодно, напр сдвинуть пиксели в каждой строке, смещение посчитать напр по sin. Или можно сжать-растянуть. Ну или вообще найти готовый набор эффектов (наверняка есть)


Название: Re: колебание буквы
Отправлено: Bepec от Май 29, 2012, 09:10
Igors я верю в ваш опыт, но...

Думаю, Burn просит любой пример. Так как я тоже вас не совсем понимаю :)

Я понимаю что надо сдвинуть строки влево. Как это сделать? Приведите пожалуйста пример ;)

PS не все работают с графикой, увы :/


Название: Re: колебание буквы
Отправлено: alexis031182 от Май 29, 2012, 09:21
Может быть так?

QTransform QImage::trueMatrix ( const QTransform & matrix, int width, int height ) [static] (https://qt-project.org/doc/qt-4.8/qimage.html#trueMatrix-2)
А далее уже можно изголяться (https://qt-project.org/doc/qt-4.8/qtransform.html#details)


Название: Re: колебание буквы
Отправлено: Bepec от Май 29, 2012, 09:28
Кхм... я попросил пример использования работы с QImage.

Igors, помоему, имел в виду работу напрямую с QImage, без посредников. Или нет?

В любом случае - я примера просил. Допустим поколебать каждую 2 строку на сантиметр влево, а каждую 1  на сантиметр вправо.


Название: Re: колебание буквы
Отправлено: Igors от Май 29, 2012, 09:53
"Колебание" - значит искажение буквы, это преобразование не описывается матрицей. Писал здесь, возможны ошибки
Код
C++ (Qt)
void DistortImageSine( QImage & ing,
                       qreal amount,         // амплитуда искажения в пикселях
                       qreal phase = 0.0,   // фаза
                       qreal freq = 1.0 )   // частота
{
for (int i = 0; i < img.height(); ++i) {
 qreal shift = sin(PI * 2.0 * (qreal(i) / img.height() * freq + phase)) * amount;
 ShiftLine((int *) img.scanLine(i), img.width(), int(shift));
}
}
 
void ShiftLine( int * data, int size, int shift )
{
 if (shift > 0)   {  // сдвиг вправо
  shift = qMin(shift, size);
  memmove(data + shift, data, sizeof(int) * (size - shift));
}
else {  // сдвиг влево
  shift = qMax(shift, -size);
  memmove(data, data - shift, sizeof(int) * (size + shift));
}
}
 
Ну и во времени меняете амплитуду и/или фазу


Название: Re: колебание буквы
Отправлено: Bepec от Май 29, 2012, 10:06
Во во. Теперь мне на 100% непонятно, значит всё верно :D С графикой уж точно не дружу ;)

Спасибо за пример. Возможно когда-нибудь и разберусь  :-\


Название: Re: колебание буквы
Отправлено: ecspertiza от Май 29, 2012, 10:37
Я если чесно думал что будет работа с пикселями :) А тут прям ....


Название: Re: колебание буквы
Отправлено: Igors от Май 29, 2012, 10:44
Если без анти-алиаса, то все очень просто. А вот с ним - не очень, ну будем надеяться до него дело не дойдет  :)


Название: Re: колебание буквы
Отправлено: Bepec от Май 29, 2012, 10:51
Хочу с пикселями :D Покажите пожалуйста.

PS хоть и не пойму ничего, зато смогу с гордостью говорить - я видел как работать с пикселями :D


Название: Re: колебание буквы
Отправлено: ecspertiza от Май 29, 2012, 10:56
Если чесно над алгоритмом еще не думал, но подозревал что работа будет проходить через QImage::setPixel() и QImage::pixel() . Попробую вечером ченить накидать, может получится чего )))


Название: Re: колебание буквы
Отправлено: Bepec от Май 29, 2012, 11:59
А не затратно будет? точнее не черезчур медленно?


Название: Re: колебание буквы
Отправлено: ecspertiza от Май 29, 2012, 13:07
Ну вообще да, не быстро будет, ибо setPixel вроде как там что то преобразовывает. Тут я думаю будет зависеть от размера буквы, и частоты обновления.


Название: Re: колебание буквы
Отправлено: Igors от Май 29, 2012, 14:12
Ну вообще да, не быстро будет, ибо setPixel вроде как там что то преобразовывает.
Если данные не ARGB, то придется использовать get/setPixel. Но такие форматы с палитрой - давно уже дань истории, зачем же нам для букв создавать такой QImage? А в ARGB пиксель = int, никакие операции с каналами в данном случае не нужны, ну и работаем c int 


Название: Re: колебание буквы
Отправлено: rp80 от Июнь 07, 2012, 20:37
Здравствуйте. Требуется отрисовать определенные буквы в определенном месте, что подскажете , я так думаю создать объект буквы, только вот как ее колебать и отрисовать на форме понятия не имею. Натолкните на идею

По всякому можно, например создать лейбл, взять его пиксмап и его вертеть, сжимать итп.
Код:
   
    QPixmap pixmap(*label->pixmap());
    QMatrix m;
    m.rotate(10);
    m.scale(1.1);
    pixmap = pixmap.transformed(m);
    label->setPixmap(pixmap);


Название: Re: колебание буквы
Отправлено: andrew.k от Июнь 07, 2012, 20:49
Здравствуйте. Требуется отрисовать определенные буквы в определенном месте, что подскажете , я так думаю создать объект буквы, только вот как ее колебать и отрисовать на форме понятия не имею. Натолкните на идею

По всякому можно, например создать лейбл, взять его пиксмап и его вертеть, сжимать итп.
Код:
   
    QPixmap pixmap(*label->pixmap());
    QMatrix m;
    m.rotate(10);
    m.scale(1.1);
    pixmap = pixmap.transformed(m);
    label->setPixmap(pixmap);
Точно. + прикрутить QPropertyAnimation так вообще делать ничего не придется.
Совершенно не понял, какой смысл букву разбивать на пиксели и их колбасить, если двигать нужно всю букву?


Название: Re: колебание буквы
Отправлено: Igors от Июнь 07, 2012, 21:08
По всякому можно, например создать лейбл, взять его пиксмап и его вертеть, сжимать итп.
Конечно можно и так, но возможностей меньше, не все можно сделать матрицей.


Название: Re: колебание буквы
Отправлено: andrew.k от Июнь 07, 2012, 22:51
По всякому можно, например создать лейбл, взять его пиксмап и его вертеть, сжимать итп.
Конечно можно и так, но возможностей меньше, не все можно сделать матрицей.
Зачем возможности? Нужно ведь букву дергать, а не пикселы.
Из пушки по воробьям?