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

Вход на сайт

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

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

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

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

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

Яндекс.Метрика Рейтинг@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.

Результат: