2.3. Yerdan burchak ostida otilgan jism harakat trayektoriyasini vizualizatsiya qilish dasturi.
Yerdan burchak ostida otilgan jism harakat trayektoriyasini vizualizatsiya qilish uchun oldingi paragraflarda ko’rilgan moddiy nuqtaning egri chiziqli harakati matematik modeli va obyektga yo’naltirilgan dasturlash tili bo’lgan Delphi muhitidan foydalanamiz.
Avvalambor Delphi ekranida joylashgan formaga obyektlarni tashlaymiz. Obyektlarni joylashtirish uchun yerdan burchak ostida otilgan jism harakatini ifodalovchi matematik model ifodasiga e’tibor beramiz:
(2.3.1)
(2.3.1) matematik modelga e’tibor qiladigan bo’lsak, boshlang’ich ma’lumotlar sifatida jism otiladigan burchak, jismga beriladigan boshlang’ich tezlik berilishi kerak ekan. koordinatasi esa 0 dan boshlab biror kichik miqdordagi qadam bilan o’zgartirib boriladi va unga mos koordinatasi qiymatlari topib boriladi.
Ana shularni e’tiborga oladigan bo’lsak, jism otiladigan burchak , jismga beriladigan boshlang’ich tezlik uchun qiymati o’zgartirilishi mumkin bo’lgan komponentalar kerak bo’ladi. Avvalambor boshlang’ich qiymatlat uchun sarlavhalarni joylashtiramiz. Bitta label tashlab, unda “Otish burchagi gradusda”, ikkinchi label tashlab, unda “boshlang’ich tezlik m/s” deb kiritamiz. Bular kiritiladigan qiymatlar uchun sarlavhalar bo’lib hisoblanadi. Qiymatlarning o’zi uchun esa edit komponentidan foydalanamiz.
“Otish burchagi gradusda” sarlavha turgan joyning pastida birinchi edit komponentasini joylashtiramiz. “boshlang’ich tezlik m/s” deb nomlangan sarlavha ostida esa ikkinchi edit komponentasini joylashtiramiz.
Jism harakati boshlanishi oldidan otiladigan burchakni o’rnatish va boshlang’ich tezlikni o’zlashtirib olish uchun birinchi button tugmasini tashlaymiz va unga “stvolni burchakka o’rnatish” deb nom beramiz. Bevosita jarayon borishini nazorat qilib boorish uchun ikkinchi button tugmasini tashlaymiz va unga “otish” deb nom beramiz. Yuqorida keltirilgan obyektlar formaga tashlanganda uning ko’rinishi quyidagicha bo’ladi:
2.3.1-chizma. Formaga boshlang’ich komponentalarni o’rnatish.
2.3.1-chizmaga e’tibor qilsak, komponentalarda boshlang’ich qiymatlar ham o’rnatilgan. Dasturni ishlatganda “stvolni burchakka o’rnatish” tugmasini bosishdan oldin boshlang’ich kiritilgan bu qiymatlarni o’zgartirish mumkin.
Stvolni burchakka o’rnatish button tugmasini aktivlashtirib quyidagi dastur qismini kirita boshlaymiz:
stvol:=50; alfa:=strtofloat(edit1.Text); radian:=alfa*3.14/180;
x1:=cos(radian)*stvol; y1:=sin(radian)*stvol; ystvol:=y1;
x1:=x0+x1; y1:=y0-y1;
// stvolni kerakli burchakka o'rnatish
form1.Canvas.Pen.Width:=6; moveTo(x0,y0); LineTo(trunc(x1),trunc(y1));
moveto(x0-10,y0); lineto(x0+25,y0); form1.Canvas.Pen.Width:=1;
Ushbu dastur qismiga e’tibor qilsak, alfa:=strtofloat(edit1.Text); operatori bilan edit1.text komponentasidan satrli deb qaralayotgan qiymat haqiqiy tipga o’tkazilib alfa nomli o’zgaruvchiga o’zlashtirib olinmoqda. E’tibor qilsak, bu qiymatni formada graduslarda kiritish so’ralgan edi. Ma’lumki, trigonometrik funksiyalar dasturda radianlarda ishlaydi, shuning uchun bu kiritilgan gradusdagi qiymatni radianga o’tkazib olish uchun matematikada ma’lum bo’lgan radian:=alfa*3.14/180; buyrug’ini beramiz. Stvolni kerakli burchakka o’rnatish uchun uni to’g’ri burchakli uchburchakning gipotenuzasi deb qarab, ikkinchi uchini ko’tarish koordinatalarini aniqlaymiz(2.3.2-chizma).
2.3.2-chizma. Stvolni burchakka o’rnatish uchun koordinatalarni aniqlash.
A na shuning uchun ham dasturda x1:=cos(radian)*stvol; y1:=sin(radian)*stvol; kabi operatorlar yozilgan. (x0,y0) koordinatalari stvol© ning chap tomoni koordinatasi hisoblanadi. Endi uning o’ng tomoni koordinatasini hisoblash uchun absissasiga qiymati qo’shamiz, ordinatasidan esa qiymatni ayiramiz. Buning sababi shuki, kompyuter ekranida koordinatalar sistemasining boshi chap uyqori burchak hisoblanadi(2.3.3-chizma).
2.3.3-chizma.Kompyuter ekranida koordinatalar sistemasini o’rnatilishi.
Uyqorida yozilgan operatorlar ana shu 2.3.2 va 2.3.3 chizmalarda keltirilgan fikrlarga asoslangan.
Endi ekranga shkala va sonlar o’qini tasvirlash uchun quyidagi operatorlarni yozamiz:
Form1.Canvas.MoveTo(Button3.left+80,Button4.Top-20);
form1.Canvas.LineTo(Button4.Left,Button4.Top-20);
for i:=1 to 5 do begin
Form1.Canvas.MoveTo(Button3.left+180+i*100,Button4.Top-25);
form1.Canvas.LineTo(Button3.left+180+i*100,Button4.Top-15);
TextOut(Button3.left+175+i*100,Button4.Top-5,inttostr(i*30)); // sonlarni quyish
Form1.Canvas.MoveTo(Button3.left+75,Button4.Top-70-i*50);
form1.Canvas.LineTo(Button3.left+85,Button4.Top-70-i*50);
TextOut(Button3.left+55,Button4.Top-75-i*50,inttostr(i*10)); end;
Ana shu yuqoridagi operatorlarga asoslangan “stvolni burchakka o’rnatish” dastur qismini ishlatsak, ekranda quyidagi ko’rinish paydo bo’ladi:
2.3.4-chizma. Stvolni 200 burchakka o’rnatish.
Bordiuy biz stvolni 40 gradusga o’rnatmoqchi bo’lsak, “otish burchagi gradusda” sarlavhasi ostidagi qiymatni 40 ga o’ggartiramiz va yana “stvolni burchakka o’rnatish” tugmasini bosamiz. Ekranda quyidagi korinish paydo bo’ladi:
2.3.5-chizma. Stvolni 400 burchakka o’rnatish.
Ekranda stvolni kerakli burchakka o’rnatgandan so’ng otish tugmasini bosib snaryad harakat trayektoriyasini aniqlashga o’tsa bo’ladi.
Snaryadni stvoldan otilib chiqishini ovozli holda tasvirlash uchun tovushli fayllardan foydalanildi. Buning uchun quyidagi protsedura chaqirilishidan foydalanamiz:
sndPlaySound('EXPLODE.WAV', SND_ASYNC);
Bunda joriy papkada joylashgan 'EXPLODE.WAV' fayli chaqiriladi va xuddi snaryadni otilgandagidek ovoz chiqariladi.
Shundan keyin snaryadning boshlang’ich tezligi qiymatini ekrandan o’qib olish mumkin. Buning uchun quyidagi opratorni yozamiz:
v0:=strtofloat(edit2.Text);
Endi ayrim o’zgaruvchilarning boshlang’ich qiymatlarini o’rnatamiz:
g:=10; x:=0; y:=0; mashtab:=4;
Bu yerda g bu o’girlik tortish kuchi, formulada ishlatiladi.
X va y koordinatalarning boshlang’ich qiymatlari.
Tayyorgarlik ishlari tugagandan keyin snaryad harakati trayektoriyasini aniqlash boshlanadi. Buning uchun quyidagi dastur qismini yozamiz:
while (x<=700) and (mashtab*y>=-ystvol) do begin
x:=x+0.01;
y:=x*sin(radian)/cos(radian)-x*x*g/(2*v0*v0*sqr(cos(radian)));
form1.Canvas.Pixels[trunc(x1+mashtab*x),trunc(y1-mashtab*y)]:=clred;
for j:=1 to 1000000 do; end;
Bu erda while – bu sharti oldindan beriluvchi takrorlash operatori, operator x ning qadamini 0,01 qilib berishga imkon beradi.
Ushbu takrorlash operatorida snaryad harakatining asosiy matematik modeli (2.3.1) qamrab olingan.
“Otish” dasturiy vositasi ishga tushirilgandan so’ng ekranda snaryad harakati trayektoriyasi ko’rina boshlaydi. Bu ko’rinish nuqtalari quyidagi operator orqali amalga oshiriladi:
form1.Canvas.Pixels[trunc(x1+mashtab*x),trunc(y1-mashtab*y)]:=clred;
Bundan ko’rinadiki, trayektoriya rangi qizil qilib belgilangan.
Agar snaryad trayektoriyasini berayotgan vaqtda ekran ko’rinishini o’zgarmas qilib olsak, u quyidagi ko’rinishga ega bo’ladi:
2.3.6-chizma. Ekrandagi berilgan boshlang’ich qiymatlarda snaryad trayektoriyasi.
Snaryad harakati boshqa boshlang’ich parametrlarda qanday bo’lishini aniqlash uchun ularni o’zgartirib ishlatib ko’ramiz:
2.3.7-chizma. O’zgartirilgan boshlang’ich qiymatlarda snaryad harakati trayektoriyasi.
2.3.7-chizmani 2.3.6-chizma bilan solishtirsak, keying holda snaryadning ancha uzoqqa borganini ko’ramiz. Chunki bunda stvol burchagi 20 dan 35 ga, boshlang’ich tezlik esa 20 dan 40 ga oshirilgan.
Endi matematik modelga yangi ob’yekt, ya’ni tankni qo’shamiz. Xayolan biz jang maydonida tankka qarshi snaryadni otish jarayonini modellashtiramiz. Buning uchun tank ob’ektini ekranga joylashtirish kerak. Tankni rasmini olib joylashtirish va uni chizish ham mumkin. Bir necha internet manbalarida tank chiziq va aylanalar orqali chizilgani ko’rsatilgan. Ularni olib qaraganimizda ancha chiroyli tuyuldi. Shuing uchun chizish variantini tanladik.
Tankni chizish uchun biz Canvas xossasining Move to, Move line, ellipse kabi usullaridan foydalanamiz[7]. Tank chizish dastur qismi quyidagicha:
MOVETO(180+x,130+y); LINETO(270+x,130+y); //tank kabinasi yuqori chizig'i
MOVETO(180+x,130+y); LINETO(180+x,160+y); // tank kabinasi chap chizig'i
MOVETO(270+x,130+y); LINETO(270+x,160+y); // tank kabinasi o'ng chizig'i
MOVETO(80+x,143+y); LINETO(180+x,143+y);// TANK PUSHKASI YUQORI CHIZIGI
MOVETO(80+x,147+y); LINETO(180+x,147+y);// TANK PUSHKASI PASTKI CHIZIGI
MOVETO(80+x,143+y); LINETO(80+x,147+y);// tank pushkasi chiziqchasi
MOVETO(140+x,160+y); LINETO(310+x,160+y); // tank oyoqlari yuqori chizig'i
MOVETO(140+x,190+y); LINETO(310+x,190+y); // tank oyoqlari pastki chizig'i
ellipse(155+x,165+y,175+x,185+y);
ellipse(185+x,165+y,205+x,185+y);
ellipse(215+x,165+y,235+x,185+y);
ellipse(245+x,165+y,265+x,185+y);
ellipse(275+x,165+y,295+x,185+y);
Ellipse(trunc(x1+mashtab*x5)-3,trunc(y1-mashtab*y5)-3,trunc(x1+mashtab*x5)+3,trunc(y1-mashtab*y5)+3);
Bu kabi dastur qismi orqali quyidagicha tank rasmi chiziladi:
2.3.8-chizma. Tank rasmini formada chizish.
Endi snaryadni otuvchi qurilma va tank joylashgan jang maydonini modellashtiramiz. Buning uchun ekrandagi snaryad otuvchi qurilma to’g’risida ekranning o’ng chekkasida tankni joylashtiramiz.
2.3.9-chizma. Snaryad otuvchi qurilma va tankni ekranga joylashtirish.
Snaryad otuvchi qurilmadan snaryad chiqishi va harakat trayektoriyasini
2.3.7-chizmada chiziq bilan tasvirlangan edi. Hozirgi holda biz snaryad otilib, tankka zarba berishini modellashtiramiz. Bunda birinchi otishda tankni nisonga olish mushkul. Shuning uchun trayektoriyani harakarini chiziq bilan emas, shar harakati bilan, izini qoldirmasdan modellashtiramiz. Agar ana shu shar harakati davomida tankka tegsa, tankni ekrandan olib tashlanishini modellashtiramiz. Snaryadni tankka tekkanini quyidagi dastur qismi bilan berish mumkin:
if ((abs(trunc(x1+mashtab*x5)-(180+x)))<20) and (abs(trunc(y1-mashtab*y5)-(130+y))<20) then begin // snaryad nisonga tegdi tankni yo'qotamiz
WITH FORM1.CANVAS DO BEGIN
PEN.Color:=CLWHITE; brush.Color:=clwhite;
Snaryad harakati ekranda quyidagicha bo’lishi mumkin:
2.3.10-chizma. Qurilmadan shar shaklidagi snaryadni otilish jarayoni.
Ushbu dastur o’yin tarzida yaratilgan. Agar birinchi otishda snaryad tankka tegmasa, ikkinchi martada snaryad otuvchi qurilma stvolini yuqori ko’tarib, otilish tezligini o’zgartirib qayta otish mumkin. Agar snaryad tankka tegsa, tank ekrandan ochiiladi.
Dostları ilə paylaş: |