Russian Qt Forum
Сентябрь 21, 2024, 12:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Движение фигуры  (Прочитано 8611 раз)
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));
}

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

Спасибо.
Записан
Bepec
Гость
« Ответ #1 : Июнь 20, 2014, 22:59 »

Разберём что есть движение - это отрисовка с частотой 24 кадра в секунду с перемещением координат рисунка.

Таким образом нам с вами нужно изменять координаты отрисовки и перерисовывать 24 раза в секунду Улыбающийся

Справитесь дальше сами?
Записан
virtus
Гость
« Ответ #2 : Июнь 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 раза в секунду? для чего это?
Записан
virtus
Гость
« Ответ #3 : Июнь 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();
}
Записан
Bepec
Гость
« Ответ #4 : Июнь 21, 2014, 00:12 »

24 раза в секунду - это частота кадров, при которой наш глаз воспринимает мельтешение кадров как плавное движение Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 21, 2014, 08:52 »

24 раза в секунду - это частота кадров, при которой наш глаз воспринимает мельтешение кадров как плавное движение Веселый
[/off]Плавность движения не решается только частотой кадров, увы - глаз все же видит "скачки".
Записан
Bepec
Гость
« Ответ #6 : Июнь 21, 2014, 12:34 »

Ну там ещё заморочек много с резкой сменой цветов и ещё чем то, насколько я помню. Улыбающийся
Но в любом случае спасибо за уточнение  Показает язык
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 21, 2014, 13:05 »

Ну там ещё заморочек много с резкой сменой цветов и ещё чем то, насколько я помню. Улыбающийся
"Не в ту степь" Улыбающийся Пример: вращающийся вентилятор, сколько fps ни давай - все без толку.

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июнь 21, 2014, 13:29 »

"Не в ту степь" Улыбающийся
"Не в ту степь" было начиная с определения движения. Улыбающийся
Движение это изменение положения объекта во времени и никаких частот там нет.
Частота обновления это совершенно другая тема, связанная не с движением, в прямом смысле, а с реалистичным представлением движения на экране.

"Смешались в кучу кони, люди..." (с)
« Последнее редактирование: Июнь 21, 2014, 13:32 от Old » Записан
Bepec
Гость
« Ответ #9 : Июнь 21, 2014, 13:36 »

Тут скорее произошла подмена слов движение и анимация.

Анимация это как раз смена с определённой частотой кадров, но при этом она кажется движением Улыбающийся

По сути движения на экране нет Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Июнь 21, 2014, 13:40 »

По сути движения на экране нет Улыбающийся
Анимация и движение это совершенно разные вещи.
Почему это на экране нет движения? Пошевелите мышкой и посмотрите на стрелочку.
Записан
Bepec
Гость
« Ответ #11 : Июнь 21, 2014, 13:49 »

Движения нет. Отдельных объектов нет. Есть лишь изменение состояния элементов, что не является движением Улыбающийся

Разделяем.

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

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Июнь 21, 2014, 13:57 »

Мда, тяжело комментировать глупости. Я заканчиваю. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.