Namangan muhandislik-pedagogika


Download 1.94 Mb.
bet6/7
Sana14.08.2020
Hajmi1.94 Mb.
#126302
1   2   3   4   5   6   7
Bog'liq
3D маъруза матни


VCL

WINDOWS API

Canvas.TextOut(x,y,myString);

TextOut(Canvas.Handle, x, y, PChar(myString), Length(String));

Canvas.FloodFill(X, Y, Color,fsBorder);

ExtFloodFill(Canvas.Handle, x, y, YourColour, FLOODFILLBORDER);

Canvas.LineTo(x,y);

LineTo(Canvas.Handle, x, y);

Canvas.MoveTo(x,y);

MoveToEx(Canvas.Handle, x, y, nil);

Shu bilan birgalikda xar xil deskriptirlar yordamida xar xil joyga rasm chizishimiz mumkin. Masalan BiTMap`ga chizish uchun "SomeBmp.Canvas.Handle", formaga chizish uchun "Form1.Canvas.Handle" deskriptorlaridan foydalanishimiz mumkin.


7- Ma`ruza: BitMap tasvirlar va ular bilan ishlash.
Oddiy grafik tasvirlar bilan ishlash albatta yaxshi, lekin grafik tasvirlarni jonliroq ifodalash uchun BitMap`lardan foydalanish undanda muhimroqdir.

BitMap – bu rasm tarkibidagi ma`lumotlarni (balandli, uzunlik, rang va x.k.), tasvirni o`zida saqlaydigan katta xajmli massiv. Undan Delphi`da foydalanish uchun TBitmap sinfi mavjut.

BitMap tasvirlar bilan ishlash uchin unchlik katta bo`lmagan dasturni ko`rib chiqamiz:
procedure TForm1.DrawBitmap(const Filename: string; const x, y: Integer);

var

Bmp: TBitmap;



begin

// dastlab fayl bor yoki yo`qligini tekshiramiz!

if not FileExists(Filename) then

begin

ShowMessage('Ushbu ' + Filename + ' nomdagi BitMap yo`q!');

Exit;

end;
Bmp := TBitmap.Create;

try

Bmp.LoadFromFile(Filename);

Canvas.Draw(x, y, Bmp);

finally

Bmp.Free;



end;

end;
Yuqoridagi funksiya BitMap tipidagi (*.bmp) tasvirni xotiraga olish va uni ko`rsatish uchun xizmat qiladi. X, Y nuqtalar tasvirning boshlang`ich nuqtalari.

GDI tarkibidagi chizish funksiyalari

TCanvas uslubi TGraphic tipi bilan ishlovch ko`pgin funksiyalarni o`z ichiga oladi. TGraphic tipi Delphida garafik obektlarni hosil qiluvchi dastlabki asosiy sinf hisoblsnsdi. Masalan, bitmap`lar (TBitmap), ikonkalar (TIcon), metafayllar (TMetafile) и JPEG-lar (TJPEGImage). Ularning barchasi uchun quyidagi jadvalda keltirilgan funksiyalardan foydalaniladi:

Bularning barchasi TCanvas uslubiga tegishli.


NOMI

VAZIFASI

FOYDALANISH USLUBI

Draw

Kanvasga TGraphic chizadi. Maydon chegaralanmaydi.

Canvas.Draw(5,10,MyGraphic);

StrechDraw

Kanvasga TGraphic chizadi. Maydon chegaralanadi.

Canvas.StretchDraw( Bounds(0,0,32,32), MyGraphic);

CopyRect

TCanvasning bir qismidan nusxa olib boshqasiga qo`yish. O`z ornida surish.

Canvas.CopyRect( Bounds(0,0,32,32), MyBmp.Canvas, Bounds(0, 0, 640, 480));

Yuqоridagi misоlda tasvirni o’zimiz hоsil qilib оldik. Endi esa qanday qilib bir murakkab tasvirni bоshqa fоnida harakatlanishini ko’rib o’tamiz. Masalan, shahar tasviri fоnida samоlyotni yurgizishni оlaylik.

Suratni siljitish effyekti suratni bir nechta jоyda vaqti-vaqti bilan qaytadan chizish usuli bilan tashkil qilinishi mumkin. Tasvirni yangi nuqtada chiqarishdan avval uni avvalgisi o’chiriladi. Suratni o’chirish to’liq fоnni bоshqatdan yoki faqat o’sha qismini chizish yo’li bilan amalga оshirilishi mumkin. Biz ko’rib o’tadigan dasturda ikkinchi yo’ldan fоydalanamiz. Tasvir Image kоmpоnentining Canvas хususiyatida Draw uslubi bilan chiqariladi, tоzalash esa fоnning kerakli qismini nusхasini оlish yo’li (CopyRect uslubi) bilan amalga оshiriladi.

Quyida BitMap tasvirni ishchi stoliga xosil qiluvch dastur matni keltirilgan:


var

DesktopCanvas: TCanvas;

bmp: TBitmap;

begin


DesktopCanvas := TCanvas.Create;

try


DesktopCanvas.Handle := GetDC(0);

try


DesktopCanvas.Rectangle(0,0,Screen.Width, Screen.Height);

Bmp := TBitmap.Create;

try

Bmp.LoadFromFile('c:\1.bmp');



DesktopCanvas.Draw(0, 0, Bmp);

finally


Bmp.Free;

end;


finally

ReleaseDC(0, DesktopCanvas.Handle);

DesktopCanvas.Handle := 0;

end;


finally

DesktopCanvas.Free;

end;

8- Ma`ruza: DirectX 3D grafikaga kirish.
Grafik tasvirlarni xosil qilish va ularni xarakatga keltirshining turli yo`llari mavjud bo`lib, biz yuqoridagi ma`ruzalarda ularning bir qanchasi bilan tanishdik. Bu ma`ruzada esa DirectX kutubxonasi yordamida tasvirlar yaratishni ko`rib chiqamiz.

Dastlab DirectX kutubxonasini o`rnatish bilan tanishaylik. DirectX kutubxonasini Intrenet tizimi yordamida http://www.delphi-jedi.org/DelphiGraphics/ sahifasidan ko`chirib olishmiz mumkin yoki ya`na bir boshqa sahifa sifatida http://www.torry.ru/vcl/packs/hhdelphix.zip dan foydalanishimiz mumkin. Olingan fayl hhdelphix.zip yoki delphix.zip ko`rinishda bo`ladi. Uning tarkibida Source papkasi mavjud bo`lib u erda DirectX ` ning barcha modullari joylashgan.



Bu modullarni Delphiga bog`lash uchun:

  1. alohida papka ochib Source papkasini ana shu papka ichiga joylanadi (Ms: C:\DirectX\Source);

  2. Delphi ishga yuklanadi;

  3. Component menyusidan Install Component buyrug`i tanlanadi. Natigada quyidagi oyna xosil bo`ladi;




  1. Xosil bo`lgan oynadan Package file name satridagi Browse… tugmasi tanlanadi va yuqorida yaratilan papka ichidan ..\Source\DelphiX_for7.dpk fayli tanlanadi, so`ngra “OK” tugmasi bosiladi;

  2. Unit file name satridagi Browse… tugmasi tanlanadi va yuqorida yaratilan papka ichidan barcha ..\Source\*.pas fayllari tanlanadi, so`ngra “OK” tugmasi bosiladi;

  3. Install Component onasidagi “OK” tugmachasi ham bosiladi. Natijada quyidagi xabar oynasi xosil bo`ladi:




  1. Xech narsani saqlamasdan Delphi ishini yakunlaymiz;

  2. Va nixoyat Delphini ishga qayta yuklaymiz. Natijada DelphiX komponentlar sahifasi paydo bo`ladi.

DirectX imkoniyatidan foydalanish maqsadida DelphiX komponentlar sahifasini Delphi`ga o`rnatdik.

O`z - o`zidan savol tug`iladi nima uchun DelphiX?

Biz bu savolga quyidagicha javob berishimiz mumkin: DirectX bu Windows muhitida ishlovchi masis drayver bo`lib, uni boshqarish uchun DirectX kutubxonasidan foydalanamiz. Delphi`dagi DelphiX komponenti esa DirectX kutubxonasi imkoniyatini o`z ichga olgan.

DirectX `dan Windows opersion sistemasida ishlashga mo`lgjallangan turli xildagi o`yinlar yaratishda foydalaniladi.

Endi DirectX komponentlari bilan tanishamiz. Ular quyidagilardir:




  • DirectDraw® - barcha animasiyalarni xosil qilish uchun ishlatiladi. Uning yordamida tasvirlarni ekranga va videoxotiraga tez chiqarishimiaz mumkin;

  • DirectSound® - Ovozni qayta ishlovchi qurilma (sound card) imkoniyatidan to`la foydalanadi;

  • DirectMusicTM – musiqa. DirectSound `dan farqi shundaki u raqamli tovushlar (WAV) bilan emas balki, ovozni qayata ishlovchi qurilmaga musiqalarni jo`natuvchi buyruqlar bilan ishlashga mo`ljallangan;

  • DirectPlay® - set va modemlar uchun dastur yaratishda foydalaniladi;

  • Direct3DR® - uch o`lcho`vli tasvirlarni ekranga oddiy yo`llar bilan chiqarishni ta`minlaydi;

  • DirectInput® - Kiritish qurilmasi bilan ishlash. (joystik, sichqoncha, klaviatura va boshqalar);

  • DirectSetup – DirectX `ni o`rnatish uchuin hizmat qiladi;

  • AutoPlay – CD diskdagi qandaydur bir daasturni ishga yuklash uchun hizmat qiladi.


Komponentli ob`yektlar modeli (COM)
Komponentli Ob`yektlar modeli – o`z ichiga ActiveX va OLE texnoligiyalarini olgan modeldir. COM – API interfeysi standartlarini aniqlaydi. Delphi esa COM va OLE texnologiyalari bilan hamkorlikda yaratilgan dasturlash tili. DirectX `dan foydalanish esa COM bilan bog`liq.

9- Ma`ruza: Uch o`lchovli Ob`yektlar bilan ishlashning yangi texnologiyalari.
Bugungi kunda kompyuter texnologiyalarining yuqori tezlik bilan o`sib borishi kompyuter dasturchilariga yangidan yangi mukammallashgan texnologilarni xayotga tadbiq etishda qo`l kelmoqda.

Uch o`lchovli Ob`yektlar bilan ishlashning yani bir turi mavjud bo`lub u DelphiX kutubxonasidir (komponentlar paltrasi mavjud). Uning yordamida turli ko`rinishdagi (2D va 3D) o`yinlarni tez va sifatli yaratish mumkin.

Endi esa DelphiX komponentlar paltrasi bilan tanishamiz (12 ta):


  • DXDraw – barcha animasiyalarni xosil qiluvchi oyna. O`z navbatida asosiy komponent;

  • DXDIB – turli tipdagi rasmni o`zida saqlash uchun hizmat qiladi;

  • DXImegeList - turli tipdagi rasmlar ketma-ketligini o`zida saqlash uchun hizmat qiladi;

  • DX3D – uch o`lchovli tasvirlarni yaratish;

  • DXSound – ovozlar bilan ishlashni ta`minlaydi;

  • DXWave - *.wav kengaytmali faylni saqlash va uni ishga tushirish uchun ishlatiladi;

  • DXWaveList - *.wav kengaytmali bir necha faylni saqlash uchun ishlatiladi;

  • DXInput – kiritish qurilmalari (klaviatura, joystik, sichqoncha) bilan ishlashni ta`minlaydi;

  • DXPlay – set va modemda ishlashga mo`ljallangan dastrlar uchhun eng asosiy komponent hisoblanadi;

  • DXSpriteEngine – Ob`yektlarni boshqarish va DXDraw bilan bog`lash uchun ishlatiladi;

  • DXTimer – belginagan vaqt oralig`ida ishlaydi va o`ziga yklangan bo`yruqlar kema-ketligini bajaradi (deyarli barcha animasiyalar uchun xizmat qiladi);

  • DXPaintBox – turli korinishdagi tasvirlarni namoish etish va tahrirlash uchun ishlatiladi.

Dastlab bu komponentlar yordamida kichik dastur yaratib ko`ramiz.

Quyidagi dastur joriy vaqtni oynaning turli joylarida va turli ranglarda ko`rsatishni ta`minlaydi:


  • yangi proyekt yaratamiz;

  • TDXDraw va TDXTimer komponentlarini formaga joylamiz hamda ularning nomlarini (Name) DXDraw, DXTimer `ga o`zgartiramiz;

  • DXDraw o`bektining Align xususiyatidan alClient satrini tanlaymiz (Object Inspector oy`nasida);

  • DXDraw ning OnInitialize xodisasiga “DXTimer.Enabled := True;” satrini kiritamiz;

  • DXDraw ning OnFinalize xodisasiga “DXTimer.Enabled := False;” satrini kiritamiz;

  • DXTimer komponentinig OnTimer xodisasiga quyidagi satrlar ketma-ketligini kiritamiz:

if not DXDraw.CanDraw then exit;

DXDraw.Surface.Fill(0);

with DXDraw.Surface.Canvas do

begin


Brush.Style := bsClear;

Font.Name := 'Lucida Console';

Font.Color := RGB(255, Random(255), Random(255));

Font.Size := 14;

Textout(Random(DXDraw.Width-100) + 3,

Random(DXDraw.Height-20) + 3, DateTimeToStr(Now));

Release;

end;


DXDraw.Flip;

- dasturni ishga tushirib (F9) natijani ko`rishimiz mumkin.


Dasturning umumiy ko`rinishi quyidagicha:
unit Unit1;
interface
uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, DXClass, DXDraws, DXSounds, DXInput;


type

TMainForm = class(TDXForm)

DXDraw: TDXDraw;

DXTimer: TDXTimer;

procedure DXDrawFinalize(Sender: TObject);

procedure DXDrawInitialize(Sender: TObject);

procedure DXTimerTimer(Sender: TObject; LagCount: Integer);

end;
var

MainForm: TMainForm;
implementation
uses MMSystem;
{$R *.DFM}
procedure TMainForm.DXDrawInitialize(Sender: TObject);

begin


DXTimer.Enabled := True;

end;
procedure TMainForm.DXDrawFinalize(Sender: TObject);

begin

DXTimer.Enabled := False;



end;
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);

begin


if not DXDraw.CanDraw then exit; {Oynaning (DXDraw) ishchi xolatini tekshirish}
DXDraw.Surface.Fill(0); { Oyna rangini o`rnatish }
with DXDraw.Surface.Canvas do

begin


Brush.Style := bsClear;

Font.Name := 'Lucida Console';

Font.Color := RGB(255, Random(255), Random(255));

Font.Size := 14;

Textout(Random(DXDraw.Width-100)+3,

Random(DXDraw.Height-20)+3, DateTimeToStr(Now));

Release; { Canvas ishini yakunlash }

end;
DXDraw.Flip; { Tasvirni oynaga uzatish }

end;
end.

10- Ma`ruza: Video rejimlar va ulardan foydalanish.
Xar qanday kompyuterda videoadapter va monitorga qarab uning video rejimi xaqida ma`lumot berish mumkin. Video rejimlar - tasvirlarni (sifatli yoki aksincha), rang va piksellarda namoish etishning turli ko`rinishidir.

Bugungi kunda 16 va 256 xil rangli yoki 8, 16 va 32 razryadli va shunga o`xshash video rejimlar mavjud. Ularni aniqlash esa yuqoroda aytib o`tkanimizdek videoadapter va monitorga bog`liq bo`ladi.

Kompyuter video rejimlari quydagicha bolishi mumkin:


Ekrandagi nuqtalar soni

Razryad

Ranglar soni

320x200

4

16

640x480

4

16

640x480

8

256

640x480

16

216

640x480

32

232

1024x768

32

232

1280x720

32

232

2048x1536

32

232

Video rejimlarni dasturiy vositalar yordamida o`zgartirish mumkin. Masalan, ishchi stolida sichqonchaning o`ng tugmasi bosilsa menyu xosil bo`ladi. Undan “Свойства” buyrug`i tanlanadi. Xosil bo`lgan onada “Параметры” sahifasidan video rejim o`zgartiriladi.

Video rejimlarni dastur tuzish yo`li bilan ham o`zgartirish mumkin. DirectX yordamida o`zgartirish SetDisplayMode funksiyasi orqali bajariladi.

Masalan: DirectDraw.SetDisplayMode(800, 600, 16);

DelphiX yordamida o`zgartirish esa DXDraw.Display xususiyati orqali bajariladi.

Masalan DelphiX `dagi dasturi :


DXDraw1.Display.BitCount := 16;

DXDraw1.Display.Height := 768;

DXDraw1.Display.Width := 1024;
bu erda BitCount – razryad, Height – Y koordinata o`qi uzunligi, Width – X koordinata o`qi uzunligi.

Shuni ham ta`kidlash lozimki videorejimning nuqtalar (pixsel) va ranglar soni qanchalik kam bo`lsa, videohotiradan shuncha tejaladi. Bu esa o`un dasturlarini tuzishda qo`l keladi.

Masalan tezligi bo`yicha dunyoda eng yqorigi o`rinlardan birini egallaydigan 320x200 nuqtali (256 xil rang bilan) video rejimda 3 o`lchovli o`yinlarni yaratish o`zining ijobiy natijasini beradi. Bu rejimga o`tish usuli GDI kutubxonasida joylashgan bo`lib, ular Death (uzish) va Resurrection (ulash) lardir. Bu usullarning yozilishi quyidagicha:
{GDI `ni uzish}

procedure Death(DC: hDC); external 'GDI' index 121;


{GDI `ni ulash}

procedure Resurrection; external 'GDI' index 122;


Bu usullardan foydalanishning to`la dasturi quyidagicha:
unit Unit1;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms, Dialogs, glLabel, glShadow, StdCtrls;
type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }



public

{ Public declarations }

end;
var

Form1: TForm1;


implementation
{$R *.dfm}
{GDI `ni uzish}

procedure Death(DC: hDC); external 'GDI' index 121;


{GDI `ni ulash}

procedure Resurrection; external 'GDI' index 122;


procedure TForm1.Button1Click(Sender: TObject);

begin


Resurrection;

end;
procedure TForm1.Button2Click(Sender: TObject);



begin

Death(Handle);



end;
end.


11- Ma`ruza: Uch o`lchovli tasvirlarni oddiy yo`llar bilan xosil qilish.
Uch o`lchovli tasvirlsrni hosil qilishning ya’na bir usuli katta nuqtalar (voksel) deb ataluvchi texnologiyasidir. Agarda kompyuter o`yinlariga qiziqsangiz “Mars” deb nomlanuvchi xajmi 4 Kb dan oshmagan 3D grafikani namoish etuvchi dasturni ko`rgan bo`lsangiz kerak. Anashu o`yin yuqoridagi texnologiyada amalga oshirilgan. Uning oyna ko`rinishi quyidagicha:


Bu texnologiya 2000 yillarning boshlarida ommamalashgan bo`lb. Uning yordamoda Magic Carpet va Comanche Maximum Overkill kabi ko`plab 3D o`yinlar yaratigan.

Vokselli taxnologiyada tasvirlarni namoish etish ucun OXY, OXZ, OYZ paralel sirtlardan foydalaniladi.

Masalan landshaft qurish algoritmi qoyidagicha bo`lishi mumkin:



  • landshaft paralellepipedlar jamlanmasi ko`rinishida bo`ladi ya`ni uch o`lchovli gistogramma hosil qiladi;

  • ko`rinish chegarasi vertikal yoylar bilan belgilanadi;

  • harakatlanish vertikal yo`nalishda boshqariladi;

  • Xar bir paralellepiped uzunligi paralellepipedga teng bo`lgan to`g`ri to`rtburcha ko`rinishida namoish etiladi;

  • Faqatgina gorizontgacha bo`lgan sirt namoish etiladi.

Natijada taxminan quyidagicha ko`rinish hosil bo`ladi:




Sirtlarni yaratish ustunlarni hisil qilsh bilan amalga oshiriladi. Uning algoritmi quyidagicha bo`ladi:

sikl

har bir ko`rinuvchi ustun uchun
eng yaqin paralellepipedni izlab top

yuqori_chegara := 0;


takrorlash
paralellepiped proeksiyasi balandligini izla

nuqtalar bilan to`ldir


yuqori_chegaradan

proyeksiya balandligigacha


paralellepiped rangi bilan

keyingi k`orinuvchi paralellepipedni izla


sikl davom etsin (yuqori_chegara ekranning yqori chegarasidan pastda bo`lsa) va (paralellepiped gorizont chegarasidan chiqmagan bo`lsa)


Keyingi paralellepipedni izlash Berzenxem usuli yordamida amalga oshiriladi. Ko`zdan korinuvchi ustun orqali ekrandagi bulutgacha barcha piksellar tekchirib chqiladi. Bulut yo`nalishini aniqlash uchun quyidagi standart formuladan foydalaniladi:




bu erda

- kuzatuvch bilan ekran orasidagi masofa
- ekran o`rtasida ko`rinuvchi ustungacha bo`lgan masofa
- kuzatuvchining ko`rtish burchagi

Paralellepipedning balandligini hisoblash uchun quyidagi formuladan foydalanamiz:



Quyida algoritmning Pascal tilidagi ko`rinishi berilgan:



type
TPoint = record
x,y: integer;
end;

procedure DrawVoxelLandscape;


var
Scan: integer; // ko`rinuvchi ustun raqami
cmPosition: TPoint; // kartadagi joriy voksel koordinatasi
csPosition: integer; // yuqori_chegara
cvHeight: integer; // joriy voksel balandligi

b_d,b_dx,b_dy,b_sy,b_ai,b_bi: integer; // Berzenxem algoritmi uchun // o`zgaruvchilar

i: integer;
begin
for
Scan := 0 to ScreenWidth-1 do
begin

cmPosition.x := MapMinDepth;
cmPosition.y := Scan-(ScreenWidth div 2);
csPosition := 1;
// Brezinxem algoritmini inisalyasiya qilish
b_dx := ViewerPosition;
b_dy := Scan - (ScreenWidth div 2);

if b_dy > 0 then


begin
b_ai := (b_dy - b_dx) * 2;
b_bi := b_dy * 2;
b_d := b_bi - b_dx;
b_sy := +1;
end else
begin

b_ai :=-(b_dy + b_dx) * 2;
b_bi := -b_dy * 2;
b_d := -b_bi - b_dx;
b_sy := -1;
end;

// ko`rinuvhi ustun xosil qilish
repeat
// keyingi paralellepipedni izlash
repeat
inc
(cmPosition.x);
if
(b_d >= 0) then
begin
inc
(cmPosition.y,b_sy);
inc (b_d, b_ai);
end else inc (b_d, b_bi);
// proeksiya balandigini aniqlash
cvHeight := Round((LandMap[cmPosition.x,cmPosition.y] -
ViewerHeight) (ViewerPosition - cmPosition.x) * ViewerPosition) + 100;
until (cmPosition.x = MapHorizon) or (cvHeight > csPosition);

// ekranning yuqori qismiga nisbatan proeksiyani chegaralash


if
cvHeight >= ScreenHeight then cvHeight := ScreenHeight;

// proyeksiyani namoish etish


for
i := csPosition+1 to cvHeight do ScreenBuffer[ScreenHeight-i,Scan] :=
LandMap[cmPosition.x,cmPosition.y];
csPosition := cvHeight;
until
(cmPosition.x = MapHorizon) or (csPosition = ScreenHeight);

// “Osmon”


for i := csPosition+1 to ScreenHeight do
ScreenBuffer[ScreenHeight-i,Scan] := 255;
end;
Natijada quyidagi ko`rinishdagi tasvir hosil bo`ladi:

Download 1.94 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling