Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #2  
Старый 12.12.2010, 15:38
AsaD AsaD вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 2
Репутация: 10
По умолчанию

Код:
  if Angle = 90.0 then
              v1 := H
            else
              v2 := W;
            for y := 0 to H do
              VertArray[y] := Bmp.ScanLine[Abs(v1 - y)];
            for x := 0 to W do
            begin
              Dest := Bitmap.ScanLine[x];
              for y := 0 to H do
              begin
                v1 := Abs(v2 - x) * 3;
                with Dest^ do
                begin
                  B := VertArray[y, v1];
                  G := VertArray[y, v1 + 1];
                  R := VertArray[y, v1 + 2];
                end;
                Inc(Dest);
              end;
            end
          end;
        180:
          begin
            for y := 0 to H do
            begin
              Dest := Bitmap.ScanLine[y];
              Src := Bmp.ScanLine[H - y];
              Inc(Src, W);
              for x := 0 to W do
              begin
                Dest^ := Src^;
                Dec(Src);
                Inc(Dest);
              end;
            end;
          end;
      else
        Rotate;
      end;
  finally
    Bmp.Free;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i,j:byte;
cs,sn:real;
min:real;
min_pos:byte;
box,get:TRECT;
n:integer;
begin
n:=0;
if (paused=true)then exit;
 g:=0.5;
 if g>2*pi then g:=0;

 for i:=1 to v_n do
  begin
   planets[i].grad:=planets[i].grad+planets[i].vec;
   if planets[i].grad>2*pi then planets[i].grad:=0;
   if planets[i].grad<0 then planets[i].grad:=2*pi;
   cs:=cos(planets[i].grad);
   sn:=sin(planets[i].grad);

   newPoints[i].x:=points[i].x*cs+points[i].z*sn;
   newPoints[i].y:=points[i].y;
   newPoints[i].z:=-points[i].x*sn+points[i].z*cs;


   newPoints[i].x:=newPoints[i].x;
   newPoints[i].y:=newPoints[i].y*cos(g)-newPoints[i].z*sin(g);
   newPoints[i].z:=newPoints[i].y*sin(g)+newPoints[i].z*cos(g);

   Viewpoints[i].x:=((newpoints[i].x*dest/(dest+newpoints[i].z))*80)+(image1.Width/2);
   Viewpoints[i].y:=((newpoints[i].y*dest/(dest+newpoints[i].z))*80)+(image1.Height/2);
   Viewpoints[i].z:=newpoints[i].z;
   planets[i].pos:=Viewpoints[i];
  end;
 image1.Canvas.Lock;
 image1.canvas.Brush.Color:=clblack;
 image1.canvas.CopyRect(image1.Canvas.ClipRect,image3.Canvas,image3.Canvas.ClipRect);
 image1.Canvas.Brush.Color:=clred;
 image2.Canvas.Brush.Color:=clwhite;
 image2.Canvas.Pen.Color:=clwhite;
 for j:=1 to v_n do
   begin
   min:=planets[1].pos.z;
   min_pos:=1;
   for i:= 2 to v_n do
      if planets[i].pos.z>min then
           begin
             min:=planets[i].pos.z;
             min_pos:=i;
           end;
   planets[min_pos].pos.z:=-3000;
   draw_posled[j]:=min_pos;
   end;
 for i:= 1 to v_n do
   begin
    begin
      image2.Canvas.Rectangle(image2.Canvas.ClipRect);
        box.Left:=0;
        box.Top :=0;
        box.Right:=round((planets[draw_posled[i]].image.Graphic.Width)*des/(des+Viewpoints[draw_posled[i]].z));
        box.Bottom:=round((planets[draw_posled[i]].image.Graphic.Height)*des/(des+Viewpoints[draw_posled[i]].z));

        get.Left:=0;
        get.Top:=0;
        get.Right:=planets[draw_posled[i]].image.Bitmap.Width;
        get.Bottom:=planets[draw_posled[i]].image.Bitmap.Height;
        image2.Transparent:=true;
        image2.Picture.Bitmap.TransparentColor:=$FFFFFF;
        image2.Picture.Bitmap.Transparent:=true;
        image2.Canvas.copyRect(box,planets[draw_posled[i]].image.Bitmap.Canvas,planets[draw_posled[i]].image.Bitmap.Canvas.ClipRect);
        image2.Width:=box.Right-box.Left;
        image2.Height:=box.Bottom-box.Top;
        n:=n+1;
        RotateBitmap(image2.Picture.Bitmap,1, clWhite);

        image1.Canvas.Draw(round(planets[draw_posled[i]].pos.x-(planets[draw_posled[i]].image.Graphic.Width div 2)*des/(des+Viewpoints[draw_posled[i]].z)),
                           round(planets[draw_posled[i]].pos.y-(planets[draw_posled[i]].image.Graphic.Height div 2)*des/(des+Viewpoints[draw_posled[i]].z)),
                           image2.Picture.Bitmap);
       end;
   end;
 image1.Canvas.Unlock;

 end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i:integer;
begin
 for i:=1 to v_n do
   begin
    planets[i].image.Destroy;           //убиваем из памяти все динамически подгруженые рисунки
   end;

end;

procedure TForm1.FormActivate(Sender: TObject);
var i:integer;
begin
  Image1.Canvas.Pixels[ 0,0]:=$FFFFFF;
  image1.Canvas.Brush.Color:=clwhite;
  image1.Canvas.Rectangle(Image3.Canvas.ClipRect);

  image3.Canvas.Brush.Color:=clblack;
  image3.Canvas.Rectangle(Image3.Canvas.ClipRect);
  for i:=1 to 1000 do
    begin
      Image3.Canvas.Pixels[ random(form1.Width),
                           random(form1.Height)]:=$FFFFFF;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i:byte;
  str:string;
begin
  v_n:=8;
  g:=0;
 AssignFile(fil,'3d.txt');
 reset(fil);
  readln(fil,v_n);
  for i:=1 to v_n do
   begin
    readln(fil);
    readln(fil,points[i].x);
    readln(fil,points[i].y);
    readln(fil,points[i].z);
    readln(fil,planets[i].vec);
    planets[i].grad:=0;
    planets[i].image:=TPicture.Create;
    readln(fil,str);
    planets[i].image.LoadFromFile(str);
   end;
 CloseFile(fil);

 g:=pi/2;

 g:=0;
 for i:=1 to v_n do
  begin
   newPoints[i]:=points[i];
   Viewpoints[i].x:=round((newpoints[i].x*100)+(form1.Width/2));
   Viewpoints[i].y:=round((newpoints[i].y*100)+(form1.Height/2));
  end;
  end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  AnimateWindow(Handle, 700, AW_BLEND)    //плавное появление формы
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AnimateWindow(Handle, 700, AW_HIDE or AW_BLEND)    //плавное растворение формы
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if paused=false then
paused:=True
else
begin
paused:=False;
end;
end;
end.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025