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

Вход на сайт

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

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

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

Я код на C++ набрал сам. Строил кривую Безье, но "прилипал" к нулю. То есть я задаю точки далеко от нуля, а он строил из нуля, а потом только обходил предложенные точки. Потом я нашёл Ваш сайт и эту статью. Оказалось, что я забыл возвести t в...
просто я не так понял, здесь мы вращаем точки куба что вращает сам куб. Мне нужно вращать просто 3д объект , данный способ не подходит
Задавайте объект в мировых координатах. Вращайте его относительно мировой системы координат. А при отрисовке преобразуйте в экранные координаты. Посмотрите пример преобразования в экранные координаты.
Это вращение по мировым осям ? Если да то как сделать по осям объекта ?
Добрый вечер! Область прорисовки остается пустой. Чего-то не хватает. Объясните плз, чего? Рамиль.

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

Рейтинг@Mail.ru
Среда программирования: 
Delphi (Lazarus)

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

Для сохранения части изображения используется класс TBitMap (битовая карта изображения). Используя методы этого класса вырезаем часть изображения и по таймеру производим восстановление изображения и прорисовку объекта на новом месте.

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  ExtCtrls, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
     // координаты прорисовки объекта. Доступны всем процедурам класса TForm1
     x1, y1 : Integer;
     ARect : TRect;
     BitMap : TBitMap;
  public
    { public declarations }
    // процедура прорисовки облака
    procedure Cloud (x, y: Integer; ColorCloud: TColor);
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Cloud(x, y: Integer; ColorCloud: TColor);
begin
  // прорисовка облака из трех эллипсов
  with PaintBox1.Canvas do begin
   Pen.Style := psClear;
   Brush.Color := ColorCloud;
   Ellipse(x,y,x+80,y+40);
   Ellipse(x+30,y+10,x+120,y+50);
   Ellipse(x+40,y-10,x+150,y+35);
  end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  // установка начальных значений
  x1:=0;
  y1:=50;
  Timer1.Interval:=30;
  // прорисовка картинки по которой двигается объект
  PaintBox1.Canvas.Brush.Color := clBlue;
  PaintBox1.Canvas.Rectangle(0,0, PaintBox1.Width, PaintBox1.Height);
  PaintBox1.Canvas.Brush.Color := clYellow;
  PaintBox1.Canvas.Ellipse(50,50, 150, 150);
  Cloud(200,100,clWhite);
  Cloud(400,10,clWhite);
  // Сохранение части изображения в BitMap-массив 
  BitMap := TBitmap.Create;
  BitMap.Width := PaintBox1.Width;
  BitMap.Height := 100;
  ARect := Rect(0,y1-10,PaintBox1.Width,y1+90);
  BitMap.Canvas.CopyRect(ARect,PaintBox1.Canvas, ARect);
  // Включение таймера - запуск анимации
  Timer1.Enabled := true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   // Восстановление изображения из BitMap-массива
   ARect := Rect(0,y1-10,PaintBox1.Width,y1+90);
   PaintBox1.Canvas.CopyRect(ARect, BitMap.Canvas, ARect);
   // Прорисовка объекта
   Cloud(x1,y1,clWhite);
   x1 := x1+1;
   // Если объект вышел за пределы окна, то начать движение объекта сначала
   if x1 > PaintBox1.Width then x1:= -100;
end;
 
end.

Прикрепленный файлРазмер
Демонстрация урока597.5 кб