Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtus от Июнь 20, 2014, 22:52



Название: Движение фигуры
Отправлено: virtus от Июнь 20, 2014, 22:52
Привет!

Подскажите, пожалуйста, как написать перемещение фигуры.

Вот код, где я рисую фигуру:

Код:
void Glass::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QBrush(Qt::red, Qt::DiagCrossPattern));
    painter.setPen(QPen(Qt::blue, 3, Qt::DashLine));
    painter.drawRect(QRect(10, 10, 110, 70));
}

Хочу теперь, чтоб она перемещалась по главному окну. Как это можно сделать?

Спасибо.


Название: Re: Движение фигуры
Отправлено: Bepec от Июнь 20, 2014, 22:59
Разберём что есть движение - это отрисовка с частотой 24 кадра в секунду с перемещением координат рисунка.

Таким образом нам с вами нужно изменять координаты отрисовки и перерисовывать 24 раза в секунду :)

Справитесь дальше сами?


Название: Re: Движение фигуры
Отправлено: virtus от Июнь 20, 2014, 23:08
спасибо. не совсем.

Сделал изменение координат, но старая фигура не стерается:

Код:
void Glass::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QBrush(Qt::red, Qt::DiagCrossPattern));
    painter.setPen(QPen(Qt::blue, 3, Qt::DashLine));
    int x=10;
    int y = 10;
    painter.drawRect(QRect(x, y, 110, 70));
    for (int i=0; i<10; i++){
        x = x + 10;
        y = y + 10;
        painter.drawRect(QRect(x, y, 110, 70));
    }
}
Как стирать старую фигуру?
и что значит перерисовывать24 раза в секунду? для чего это?


Название: Re: Движение фигуры
Отправлено: virtus от Июнь 20, 2014, 23:29
Разобрался. Вот код для движения фигуры:

Код:
#include "glass.h"
int i = 1;

Glass::Glass(){
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(mover()));
    timer->start(50);
}

void Glass::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QBrush(Qt::red, Qt::DiagCrossPattern));
    painter.setPen(QPen(Qt::blue, 3, Qt::DashLine));
    int x=10;
    int y = 10;
    painter.drawRect(showRect());
}

QRect Glass::showRect(){
    QRect rect(20, 20, 20, 20);
    double x = i;
    double y = i;
    i = i + 2;
    rect.moveBottomRight(QPoint(x, y));
    return rect;
}

void Glass::mover(){
    update();
}


Название: Re: Движение фигуры
Отправлено: Bepec от Июнь 21, 2014, 00:12
24 раза в секунду - это частота кадров, при которой наш глаз воспринимает мельтешение кадров как плавное движение :D


Название: Re: Движение фигуры
Отправлено: Igors от Июнь 21, 2014, 08:52
24 раза в секунду - это частота кадров, при которой наш глаз воспринимает мельтешение кадров как плавное движение :D
[/off]Плавность движения не решается только частотой кадров, увы - глаз все же видит "скачки".


Название: Re: Движение фигуры
Отправлено: Bepec от Июнь 21, 2014, 12:34
Ну там ещё заморочек много с резкой сменой цветов и ещё чем то, насколько я помню. :)
Но в любом случае спасибо за уточнение  :P


Название: Re: Движение фигуры
Отправлено: Igors от Июнь 21, 2014, 13:05
Ну там ещё заморочек много с резкой сменой цветов и ещё чем то, насколько я помню. :)
"Не в ту степь" :) Пример: вращающийся вентилятор, сколько fps ни давай - все без толку.

Как (упрощенно) происходит фотосъемка: затвор открыт некоторое время в течение которого объект движется, пленка ловит не только "конечное положение", но все за это время. Если скорость достаточно велика, то получается только размазанный "след". Человеческий глаз работает подобным образом.

Простое решение (brute force) для одного кадра смешать неск изображений по альфе, которые сначала посчитаны с каким-то мелким шагом по времени. 


Название: Re: Движение фигуры
Отправлено: Old от Июнь 21, 2014, 13:29
"Не в ту степь" :)
"Не в ту степь" было начиная с определения движения. :)
Движение это изменение положения объекта во времени и никаких частот там нет.
Частота обновления это совершенно другая тема, связанная не с движением, в прямом смысле, а с реалистичным представлением движения на экране.

"Смешались в кучу кони, люди..." (с)


Название: Re: Движение фигуры
Отправлено: Bepec от Июнь 21, 2014, 13:36
Тут скорее произошла подмена слов движение и анимация.

Анимация это как раз смена с определённой частотой кадров, но при этом она кажется движением :)

По сути движения на экране нет :)


Название: Re: Движение фигуры
Отправлено: Old от Июнь 21, 2014, 13:40
По сути движения на экране нет :)
Анимация и движение это совершенно разные вещи.
Почему это на экране нет движения? Пошевелите мышкой и посмотрите на стрелочку.


Название: Re: Движение фигуры
Отправлено: Bepec от Июнь 21, 2014, 13:49
Движения нет. Отдельных объектов нет. Есть лишь изменение состояния элементов, что не является движением :)

Разделяем.

Движение в реальном мире - перемещение объекта в какой либо системе координат с точкой начала отсчёта.

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

ps но это уже болтология пошла, давайте закончим на том, что все правы в равной мере.


Название: Re: Движение фигуры
Отправлено: Old от Июнь 21, 2014, 13:57
Мда, тяжело комментировать глупости. Я заканчиваю. :)