LINUX.ORG.RU

Анимированная пунктирная линия «муравьи» на C++ / Qt.


0

2

Как скорее всего реализована анимация вот таких муравьёв http://savepic.ru/3339423.png ?

1) Перерисовывается прямоугольная область экрана, куда сначала рисуется то, что под выделением, потом закрашивается хитрая область, потом обводится следующим шагом анимации муравьёв?

2) Меняются только сами пиксели муравьёв? Аккуратно стираются пиксели исключительно с муравьями, отображающие предыдущий кадр анимации и рисуются новые муравьи для следующего кадра?

Qt здесь при том, что мне интересно, как это сделать на C++. Ещё я знаю, что быстрее всего картинку в Qt можно вывести на экран, если она хранится в QPixmap.

Короче, мне очень интересно, как реализованы эти муравьи, причём говорить интересно в терминах Qt. Можно придумать красивый алгоритм, но в средствах Qt он будет тормозным. Знаю, что программа - на C++ и 2005 VisualStudio, если важно ( iZotope RX (64-bit) )

Спасибо.

★☆

Последнее исправление: kiverattes (всего исправлений: 1)

первое что пришло в голову: рисовать паттерн с диагональными полосами, по маске в которой нарисована линия.

waker ★★★★★
()

Две текстуры OpenGL, не?

vertexua ★★★★★
()
Ответ на: комментарий от waker

в примере явно не так.

на кривой есть участки с левым и правым наклоном, длина «муравьёв» была бы переменной.

более того, «муравьи» бежали бы не по кругу, на противоположных участках бежали бы сонаправленно, возникая в одной точке, и исчезая в другой.

qbe
()
Ответ на: комментарий от waker

для понятности, в гимпе:

1. новый слой
2. нарисуй линию толщиной 1px в гимпе (там где хочешь муравьев)
3. add layer mask -> layer's alpha channel
4. disable layer mask (временно)
5. на слое толстой кистью рисуешь диагональные линии
6. enable layer mask
7. двигай картинку влево вправо инструментом перетаскивания - получится тот же эффект что ты хочешь.

теперь думай как это же реализовать в qt. не думаю, что это особо сложно.

что-то вроде этого должно получиться: http://img401.imageshack.us/img401/5138/antsq.png

waker ★★★★★
()
Ответ на: комментарий от qbe

в большинстве случаев, это вполне приемлемо. в гимпе оно так и выглядит, например. как именно оно сделано в примере я не знаю. можно придумать кучу более сложных вариантов - но зачем?

waker ★★★★★
()
Ответ на: комментарий от waker

Слишком муторно - слои, прозрачность. Ну его нах. Более того, комментаторы выше заметили, что при таком способе длина муравьёв будет разной и ползти они будут не строго по кругу.

kiverattes ★☆
() автор топика
Ответ на: комментарий от kiverattes

Слишком муторно - слои, прозрачность

это было для иллюстрации алгоритма. ничего проще этого способа я не знаю — все остальное будет сложнее. (судя по тому, что даже этот способ вам кажется сложным — не вижу смысла советовать что-то более сложное).

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от waker

Спасибо! Но вопрос больше в сторону Qt или «специфики Qt». Буквально вопрос можно понять так: «кто это делал на Qt и как вы это делали, а если вы гуру Qt, то как БЫ вы это делали в Qt» (-; (-; Приходится скрывать суть вопроса под вежливыми формулировками, чтобы завлечь читателя.

kiverattes ★☆
() автор топика
Ответ на: комментарий от kiverattes

я вообще qt не использовал никогда. думается, там это делается так же как в любом другом тулките. главное понимать принцип.

более сложный и тормозной вариант:

1. берем битмап нашей выделенной области, и строим силуэт (контур)
2. обводим контур пунктирным паттерном попиксельно
3. на следующем кадре отрисовки, сдвигаем паттерн на нужное количество пикселей

в принципе, по тормознутости не особо хуже простейшего варианта, но немножко сложнее в реализации.

waker ★★★★★
()

Ну, в Qt же можно рисовать пунктирные линии, можно в том числе управлять сдвигом пунктира. См. QPen. А всем низким уровнем обычно занимается QGraphicsView и т.д. Если это будет тормозить, то только тогда уж нужно смотреть на оптимизацию и проч.

trycatch ★★★
()

В Qt уже всё встроено, что вам нужно. Делается примерно так:

painter.setPen(Qt::DashLine);
painter.setBrush(QBrush(QColor(255, 255, 255, 127))); // semitransparent white
QPainterPath path;
... // construct path shape
painter.drawPath(path);
Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Для анимации муравьёв по таймеру менять QPen::setDashOffset(). Чтобы рисовалось быстро делать окну update(path.boundingRect()). При этом фоновую картинку предварительно перегонять в QPixmap и рисовать сначала её простым блитом, а сверху — path с муравьями. Полупрозрачное облако можно тоже закешировать туда же в QPixmap и рисовать муравьёв с Qt::NoBrush.

Dendy ★★★★★
()

Если знать или иметь возможность вычислить каждый пиксель обводки, то можно простым XOR-ом менять по таймеру. То есть, вариация второго варианта.

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.