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

Вход на сайт

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

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

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

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

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

Рейтинг@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 вот так надо двигаться