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

Вход на сайт

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

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

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

torrvic, возможно, Вам нужно добавить -lGLU
Извините за тупой вопрос. У меня при сборке Вашего примера выходит ошибка: "undefined reference to gluLookAt". Не могу найти в какой библиотеке находится эта функция. У меня задано: -lGL -lglut ... Искал в /usr/lib таким образом: nm lib*so* | grep...
Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...

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

Рейтинг@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.

Результат: