Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
PascalABC.NET

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

В качестве примера создадим движение нескольких (примитивных) фигур по заданной траектории.

Без чего мы обойтись не сможем, не сможем мы обойтись без нескольких инструментов:

Процедура LockDrawing;

Рисование средствами PascalABC происходит очень медленно. Пока оно идет, картинка на экране успевает много раз обновиться. Отсюда мерцание. То есть, мы видим не окончательную картинку, а процесс ее рисования. Окончательную картинку в общем-то не видим — как только она построилась, мы ее тут же стираем и начинаем новый цикл рисования. Для борьбы с этим эффектом придумали двойную буферизацию. Идея в том, чтобы сначала построить картинку в памяти (не выводя на экран), а затем отобразить новый кадр на экране целиком, без промежуточных вариантов, где не хватает половины лучиков. Для этого в начале программы вызываем процедуру LockDrawing.

Процедура ClearWindow (color);

После каждой прохода по циклу очищает графическое окно указанным цветом, который передается в качестве параметра.

После этого все команды рисования будут создавать картинку в памяти (в так называемом вторичном буфере). Непосредственно на экране ничего рисоваться не будет. После того, как очередной кадр анимации полностью отрисован (то есть перед ClearWindow), нужно вызвать процедуру

Redraw;

Эта процедура вызовет перерисовку всей картины.

Нарисуем сначала четыре окружности.

program animation;
uses GraphABC;
begin
    SetWindowSize(400, 400); //Размер окна
    //Отрисовка четырех окружностей.
    Circle (100, 100, 20);
    Circle (300, 100, 20);
    Circle (100, 300, 20);
    Circle (300, 300, 20);            
end.

Получим результат:

Второй стадией, будет отрисовка пятой окружности и с помощью вышеуказанных процедур и цикла заставим его двигаться по заданной траектории.

program animation;
uses GraphABC;
var i : integer;
begin
    SetWindowSize(400,400);
    LockDrawing;
    //Движение от первой точки до второй
    for i:=100 to 300 do
    begin
        SetBrushColor(clWhite);
        Circle (100, 100, 20);
        Circle (300, 100, 20);
        Circle (100, 300, 20);
        Circle (300, 300, 20);
        SetBrushColor(clBlack);
        Circle (i, 100, 20);
        RedRaw;
        ClearWindow(clWhite);
    end;
    //Движение от второй точки до третьей
    for i:=100 to 300 do
    begin
        SetBrushColor(clWhite);
        Circle (100, 100, 20);
        Circle (300, 100, 20);
        Circle (100, 300, 20);
        Circle (300, 300, 20);
        SetBrushColor(clBlue);
        Circle (300, i, 20);
        RedRaw;
        ClearWindow(clWhite);
    end;
    //Движение от третьей точки до четвертой
    for i:=300 downto 100 do
    begin
        SetBrushColor(clWhite);
        Circle (100, 100, 20);
        Circle (300, 100, 20);
        Circle (100, 300, 20);
        Circle (300, 300, 20);
        SetBrushColor(clRed);
        Circle (i, 300, 20);
        RedRaw;
        ClearWindow(clWhite);
    end;
    //Движение от четвертой точки до первой
    for i:=300 downto 100 do
    begin
        SetBrushColor(clWhite);
        Circle (100, 100, 20);
        Circle (300, 100, 20);
        Circle (100, 300, 20);
        Circle (300, 300, 20);
        SetBrushColor(clGreen);
        Circle (100, i, 20);
        RedRaw;
        ClearWindow(clWhite);   
    end;
end.

Результат:

Комментарии

perfektum аватар
Опубликовано perfektum в 13. Июнь 2019 - 8:54.

приветь

sezim аватар
Опубликовано sezim в 13. Ноябрь 2018 - 5:40.

Можно точно вот эту программу просто наоборот типа:4,3,2,1,4 вот так надо двигаться