Войти Регистрация

Docx

  • Рефераты
  • Дипломные работы
  • Прочее
    • Презентации
    • Рефераты
    • Курсовые работы
    • Дипломные работы
    • Диссертациии
    • Образовательные программы
    • Инфографика
    • Книги
    • Тесты

Информация о документе

Цена 50000UZS
Размер 2.6MB
Покупки 0
Дата загрузки 30 Март 2026
Расширение doc
Раздел Дипломные работы
Предмет Информатика и ИТ

Продавец

Rajabov Yorbek

Дата регистрации 19 Март 2026

0 Продаж

Kompyuter tizimlari va ularning dasturiy ta’minoti

Купить
Kompyuter tizimlari va ularning dasturiy ta minoti’
KIRISH
I - bob Uch o lchovli murakkab soha diskret modelini kompyuter 	
’
vositasida yaratish muammolari
1.1§. Masalani echish usullarini tahlili
1.2§. Uch o lchovli murakkab soha diskret modelini yaratish masalasi 	
’
qoyilishi
1.3§. Kompyuterning ekranida murakkab soha diskret modelini yaratish
II - bob Murakkab konfiguratsiyali sohalarni diskret modelini tuzish
2.1§. Uch o lchovli proeksiyasi to rtburchak elementar sohaning diskret 
’ ’
modeli 
2.2§. Uch o lchovli proeksiyasi uchi o yilgan to rtburchak elementar 
’ ’ ’
sohaning diskret modeli
2.3§. Uch o lchovli proeksiyasi egri chiziqli to rtburchak elementar 
’ ’
sohaning diskret modeli
2.4§. Uch o lchovli proeksiyasi sektor elementar sohaning diskret modeli 
’
2.5§. Murakkab soha diskret modelini yaratish algoritmi
III -  bob Murakkab soha diskret modelini tuzuvchi programma ta minoti	
’
3.1§. Programma ta minotining asosiy modullari	
’  
3.2§. Programma ta minotining strukturasi
’
3.3§. Test masalasini echish va natijalarni tahlil qilish
Dissertatsiya bo`yicha xulosa
Foydalanilgan adabiyotlar
Ilova. Kirish
O zbekiston   mustaqillikka   erishgandan   so ng   davlatimizning   asosiy’ ’
qonuni   -   Konstitutsiyasi   bilan   kafolatlangan   muxim   xujjatga   ega   bo ldik.   Ular	
’
orasida   O zbekistonda   "Kadrlar   tayyorlash   milliy   dasturi"   va   "Axborot	
’
texnologiyalari sohasida kadrlar tayyorlash tizimini takomillashtirish"[1,2] aloxida
o rin   tutadi.   Undagi   g oyalar   avvalo   XXI   asrda   yashaydigan,   Vatan   va   yurt	
’ ’
mustaqilligini mustaxkamlovchi yoshlarning manfaatini ifodalaydi. Dasturda etirof
etilgan   kadrlar   tayyorlash   tizimini   rivojlantirishning   asosiy   yo nalishlarida   shu	
’
narsa   aloxida   belgilandiki,   ta'lim   tizimini   yaxlit   axborotlashtirish   hozirgi   zamon
talablariga muvofiqlashuvini  ta'minlaydi. Bu dasturlarni  o ttgan davr  mobaynida	
’
sarxisob   qilib,   ularning   eng   muxim   xususiyatlaridan   biri   sifatida   hozirgi   ta'lim
dasturlarida   nazarda   tutilayotgan   zamonaviy   axborot   texnologiyalari,   ta'limni
kompyuterlashtirish va kompyuterlar tarmoqlari tizimida ta'lim jarayonini axborot
bilan   ta'minlashni   yanada   rivojlantirishni   nazarda   tutmoqdamiz.   Zero,   milliy
dasturlarni   ro yobga   chiqarishga   doir   tashkiliy   ishlarda   etirof   etilganidek,	
’
"Ta'limni axborot bilan ta'minlash tizimini shakllantirish va rivojlantirish uni jaxon
axborot   tizimi   bilan   bog lash,   ommaviy   axborot   vositalarining   ta'lim   sohasidagi	
’
vazifalarini belgilash" malakali mutaxassislarni tayyorlashni muxim mezonlaridan
biridir.
Hozirgi zamonda amaliy masalalarni yechish programma komplekslari har xil
sohalarda   bo`layotgan   jarayonlarni   avtomatlashtirish   imkonini   beryabdi.   Shu
sohalardan   biri   bo`lgan   sanoat,   avtomobil   va   aviasozlik   sohalarda   ishlatiladigan
konstruksiyalar   elementlarining   kuchlanganlik   holatini   xisob   kitob   qilish   va
ularning mustahkamligini aniqlash masalasi dolzarb deb hisoblanadi.
Bu   jarayonlarni   avtomatlashtirish   uchun   avvalo   berilgan   konstruksiya
to`g`risidagi ma lumotlarni to`plash talab qilinadi. Bu masala murakkab bo`lgani	
’
sababli   uni   bajarish   uchun   quyidagi   amallar   bajariladi.   Avvalo   murakkab   sohani
bir   necha   elementar   sohalarga   ajratib   olinadi.   Elementar   soha   deganda   sohaning
diskret modelini yaratish algoritmi mavjud bo`lgan sohalar tushuniladi. Shu sababli jarayonning   birinchi   qismida   elementar   sohalarning   diskret   modelini   yaratish
haqida tushuncha berib o tiladi. Bu yerda barcha elementar sohaga oid modullar’
mavjud bo`ladi. So`ngra bu soharlarni  u l ash  jarayoni algoritmi va programma	
“ ”
ta minoti   yaratiladi.   So`ngra   boshlang`ich   sohani   tashkil   qiladigan   har   bir	
’
elementar   sohalarni   ulash     asosida   kerak   bo`lgan   murakkab   sohaning   diskret
modeli yaratiladi.
Fan   va   texnikada   xar   doym   muntazam   bo lmagan   fizik   tuzilishlarga   va	
’
murakkab geometrik konfiguratsiyaga ega bo lgan tizim hisoblash muommolariga	
’
duch kelishimizga to g ri keladi. Kompyuterlar shunday hisoblashlarni taxminiy	
’ ’
sonlar metodlari yordamida amalgam oshirish imkoniyatini beradi.  
Maskur   magisterlik   dissertatsiya   ishi   uch   o`lchovli   murakkab
konfiguratsiyalik   sohaning   diskret   modeli   algoritmi   va   programma   ta minotini	
’
yaratishga bag`ishlangan.
Dissertatsiya   kirish,   uchta   bob,   dissertatsiya   bo`yicha   xulosalar,   foydalangan
adabiyotlar ro`yhati va ilovalardan iborat.
Birinchi   bobda   hozirgi   kunga   kelib   murakkab   konfiguratsiyalik   sohalarni
diskret   modelini   tuzish   dolzarbligi,   qanday   maqsadlarga   ishlatilishi   va   qaysi
sohalarda   keng   qo llanilishi   atab   o tiladi.   Shuningdek   ushbu   mavzuga   oid	
’ ’
qilingan   ishlar   va   metodlar   haqida   ham   to xtalib   o tiladi.   Dikret   model	
’ ’
tushunchasi, tarixi va albatta hozirgi kungacha rivojlanib kelgan va sohalarda keng
qo llanilayotgan   metodlar   ya ni   chekli   elementlar   metodi,   uning   kamchilik   va	
’ ’
ustunliklari   haqida   batafsil   yoritib   ketiladi.   Chekli   elementlar   metodi   asosida
yaratilgan   ANSYS,   LS   DYNA   programma   paketlarining   ishlash   prinsipi   va	
–
strukturasim ulardagi elementlar turi haqida tushuncha berib ketiladi.
Ikkinchi   bobda   programma   ta minoti   asosi   haqida   tushuncha   yurutiladi.	
’
Programma   ta minotida   ishlatiladigan   elementar   sohalarning   har   bir   turi   keltirib	
’
o tiladi.   Elementar   sohalarning   ikki   o lchovlidan   uch   o lchovliga   o tqazish	
’ ’ ’ ’
yo llari   keltirib   o tiladi,   dasturga   ularning   surish,   ko chirish   va   surish
’ ’ ’
imkoniyatlari beriladi va ularning algoritmi va blok sxemasi har bir elementar soha turi   uchun   alohida   keltirib   o tiladi.   Ulardan   keyin   sohalarni   yig ish   algoritmi’ ’
beriladi va murakkab soha diskret modelini tuzish algoritmi yaratiladi.
Uchinchi bob ikkinchi bobda keltirilgan metod asosida yaratilgan programma
ta minoti   haqida   tushuncha   beriladi.   Konstruktorning   ishlash   prinsipi   va	
’
strukturasi beriladi. Konstruktor murakkab sohaning visual ko rinishi chiziladi va	
’
chizilgan soha elementar sohalarga ajratiladi va har birining alohida diskret modeli
tuziladi,   keyinchalik   yig ish   jarayonlari   tugagach   diskret   modeli   olinadi.	
’
Konstruktorning   ishlashi   haqida   qisqacha   tushuncha   aytib   o tildi.   Keyinchalik	
’
testlash   uchun   konstruktorda   masala   echiladi   va   uning   natijasini   visual
ko rinishda ko riladi.	
’ ’
Yakunda   qilingan   ishlar   buyicha   umumiy   xulosa   va   adabiyotlar   ro yxati	
’
ko rsatiladi.	
’ I   BOB–
U Uch o lchovli murakkab soha diskret modelini kompyuter vositasida	
’
yaratish muammolari  
1.1§.  Masalani echish usullarini tahlili
Hozirgi   zamon   va   kelajakda   jadal   tarzda   rivojlanayotgan   fan   va   texnikani
kompyuter  texnologiyalarisiz   tasovur   qilib  bo lmaydi.  1950    yillardan  boshlab	
’ –
hozirgi kungacha komyuter texnologiyalari rivojlanib hozirda deyarli barcha soha
va insonlar hayotida qo llanilib kelmoqda.	
’
Ushbu   qisqa   yillar   mobaynida   uning   shunchalik   teran   va   keng   miqyosta
qo llanilayotganligining asosiy sabablari barcha sohalarda uning ishlashi tez, soha	
’
mutaxassislari   uchun   qulay,   xatoliklari   kam   uning   ustiga   xatoliklarni   tog irlash	
’
mumkinligi,   ma lumotlarning   xavfsizlik   jihatidan   ham   bir   qancha   ustinliklarga	
’
ega va eng asosiy sabablaridan biri bu uning tejamkorligi.
Yuqorida keltirilgan sabablarga misol sifatida kompyuter texnologiyalarining
bir   necha   sohalarda   qo llanilishini   keltirib   o tiladi   va   bugungi   kunda   qanday	
’ ’
imkoniyatlarni   berganligi   va   qanday   foydali   ishlarni   qilinganlarini   ham   birma  	
–
bir   atab   o tiladi.   Misol   o rnida   fizik   eksperimentdan   o tilayotgan   qattiq   bir	
’ ’ ’
jismga   kuch,   temperatura   yoki   bosim   berilgandan   keyingi   jismning   holatini
aniqlash lozim.
Bunday   odiiy   fizik   eksperiment   uchun   ham   joy,   resurs,   vaqt   va   mablag	
’
ketadi.   Shuning   uchun   ishlab   chiqarish   korxonalarida   asosiy   mablag   ishlab	
’
chiqarish   maxsulotini   testlashga   ketadi.   shunday   vaziyatlar   bo ladiki
’
eksperimentdan o tayotgan jismning ma lum bir temperatura ostida ming yildan	
’ ’
keyingi   holatini   aniqlash   lozim   bo lsayu   unga   beriladigan   tashqi   ta sirlar	
’ ’
o zgaruvchan   bo lsa   buni   aniqlash   murakkab   hisoblanadi.   Yanada   jismga   1000	
’ ’
yoki   undan   ortiq   issiqlik   temperaturasini   berish   kerak   bo lsa,   unda   bu   fizik	
’
eksperiment uchun juda katta mablag  va vaqtni talab etadi.	
’
Ushbu qo yilgan masalani echishni kompyuterning programma ta minotiga	
’ ’
topshirilsa yuqoridagi atab o tilgan joy, tabiiy resurs, vaqt va mablag ning keragi	
’ ’
bo lmaydi.   Buning   uchun   programma   ta minotiga   jismning   hozirgi   holati   va	
’ ’ xususiyatlarini   kiritish   kerak.   Programma   ta minoti   mutaxassis   kiritgan’
parametrlardan foydalanib uning keyingi  holatiga qanday temperatura, vaqt, kuch
va   kuchlanish   orqali   o tganligini   hisoblab,   uning   visual   ko rinishini   chiqarib	
’ ’
beradi.
Demak ,   eksperimentdagi   jism   xususiyatlarini   aniqlash   uchun   birinchi
navbatda   jismning   hozirgi   holati   aniqlanadi.   Keyin   jismga   ma lum   kuch,	
’
temperatura va boshqa tashqi ta sirlar ma lum vaqt mobaynida berilib boradi va	
’ ’
jism   vaqt   bo yicha   o zgargan   holatiga   qarab   taxlil   qilinadi   va   uning   keyingi	
’ ’
holati aniqlanadi. Shu tariqa eksperimentdagi jism o rganiladi.	
’
Jism   ustida   eksperimentni   o tqazuvchi   programma   ta minotini   yaratish   bir	
’ ’
necha   bosqichlardan   iborat:   jism   hosizgi   holati   bunga   visual   ko rinishi   ham	
’
kiradi, tashqi ta sirdan keyingi jism holati va taxlil qilish.	
’
Bulardan   qilinadigan   asosiy   masala   bu   jismni   eksperimentlash   uchun
programma   ta minotida   visual   ko rinishini   ifodalash   bo ladi.   Jism   programma
’ ’ ’
ta minotida   soha   sifatida   yuritiladi.   Sohaning   qanday   ko rinishda   bo lishi	
’ ’ ’
keyinchaik   eksperiment   qilish   uchun   juda   muhim   hisoblanadi.   Shuning   uchun
kompyuterga kiritiladigan jism ko rinishi o zgaruvchan deb olinadi.	
’ ’
Demak,   echilishi   kerak   bo lgan   masala   bu   uch   o lchovli   murakkab
’ ’
konfiguratsiyalik   soha   diskret   modelini   tuzish   programma   ta minotini   yaratish	
’
bo ladi.   Bironta   sohani   ekranda   tasvirlash   uchun   uning   koordinatalaridan	
’
foydalaniladi. Jismga qandaydir  kuch berilganda kuch jism  buyicha taqsimlanadi.
Jism   sohasiga   taqsimlan   kuchni   aniqlash   maqsadida   sohani   chekli   elementlarga
ajratib   chiqiladi.   Chekli   elementlar   raqamlangan   tugun   nuqta   koordinatalaridan
tashkil topgan.
Berilgan kuch, sohaga qay tarzda taqsimlanishini chekli elementlarga ajratish
orqali echish imkoniyatini beradi. Bu masalaning yana bir asosiy muammolaridan
biri   murakkab   sohani   diskret   modeli   hisoblanadi.   Hozirda   murakkab   soha   diskret
modelini   tuzishda   aniq   bir   algoritm   mavjud   bo lmaganligi   sababli,   ushbu	
’
masalani   echish   uchun   bir   necha   usul   va   metodlar   ishlab   chiqilgan   va   ularga
programma ta minoti yaratilgan.	
’ Ishlab   chiqilgan   metodlardan   keng   tarqalgani   bu   chekli   elementlar   metodi
bo lib, u murakkab sohani chekli elementlarga ajratib chiqadi va murakkab soha’
diskret modeli tuziladi. Ushbu metodga asoslangan bir necha programma paketlari
ishlab   chiqilgan   bo lib,   ularga   ANSYS,   LS     DYNA,   ALGOR,   NASTRAN,	
’ –
ABAQUS,   MARC,   COSMOS/M   va   boshqa   programma   paketlarini   misol   qilish
mumkin.   Bulardan   ANSYS   chekli   elementlar   metodi   asosida   yaratilgan   bugungi
kundagi eng kuchli va eng og ir paket hisoblanadi va avvalo chiziqsiz masalalarni	
’
echishga   mo ljallangan.   LS     DYNA   dinamika   masalalarini   echishda	
’ –
etakchilardan deb tan olingan (harakatdagi o z   aro bog liqlik ham).	
’ – ’
Mexanikaning   qattiq   jismning   deformatsiyalanishi,   issiqliq   almashinishi,
gidrodinamika va elektromagnit maydon masalalarini echishda keng qo llaniladi.	
’
Hisoblash   matematikasi   nuqtai   naxaridan,   chekli   elementlar   metodi   g oyasi	
’
shundan   iboratki,   variatsion   masalaning   funktsionalini   minimizatsiyalash   xar   biri
o zining   soha   ichida   aniqlangan,   tizimni   sonli   analiz   qiluvchi   funtsiyalar	
’
to planmasi   bizga   diakoptikaning   ma lum   bir   tarmog u   sifatida   ko rishning
’ ’ ’ ’
imkonini   beradi.   Diakoptika     tizimdagi   ko’rilayotgan   sohaning   bo’laklarga	
–
ajratip olish metodi.
Chekli   elementlar  metodining asosiy  ustunligi   bu sohaning  ixtiyoriy shaklini
chekli   elementlarga   ajrata   olish   imkoniyatiga   ega,   shuningdek   konstruktiv
xususiyatlari   bilan   birga   real   detallarning   deformatsiyalanish   va   kuchlanganlik
maydonini hisoblash imkoniyatiga ham ega.
Lekin   birgina   sohalarni   chekli   elementlarga   ajratish   emas,   xar   bir
bo linishning   o zining   asosiy   funkstsiyalar   to plamiga   ega,   ular   mos   ravishda	
’ ’ ’
oz ining   echimi   mavjud   (oz ining   ko chish   maydoni,   deformatsiya   va
’ ’ ’
kuchlanish). Foydalanuvchi tomonidan chekli elementlarni qurish orqali hisoblash
natijalariga   bog liqligi   va   qabul   qilingan   natijalarni   aniqligini   tekshirish	
’
murakkabligi metodning asosiy kamchiliklaridan hisoblanadi.
Chekli elementlar metodining kamchiliklari quyidagilarga bog liq:	
’  diskretizatsiyalash xatoliari, ko rsatgan natija ko rib chiqilayotgan soha’ ’
(qismlari)   chegaralarining   va   ularning   chekli   element   modeli   geometrik
farq qilishi.
 Bazis   funktsiya   xatoliklari,   berilgan   ko rinishning   bazis   funktsiyaning	
’
kompbinatsiya   ko rinishida   tasvirlanishi   va   aniq   echim   orasidagi	
’
bog lanishlar farqi.	
’
 Aylana   hosil   qilishdagi   xatolik,   kompyuterning   guruhli   setka   chekli
uzunligiga   va   chekli   elementlar   metodi   yordamida   masala   echish
mobaynida katta sonllar operatsiyasiga bog liq.	
’
Chekli elementlar xajmi kamayishi bilan diskretizatsiya xatoliklari kamayadi,
lekin   bazis   funktsiya   va   aylana   hosil   qilish   xatoliklari   kamaymaydi   (barcha
holarlarda   shart   emas).   Lekin   bugungi   kunda   chekli   elementlar   metodi
kamchiliklarini   baholovchi   umumiy   metod   (universal   va   nazariy   jihatdan
isbotlangan)   mavjud   emas,   haqiyqiy   masala   aniq   echimi   esa   odatda   noma lum.	
’
Shning   uchun   kamchiliklarni   baholarshda   ko pinchilik   holatlarda   quyidagi	
’
usuldan   foydalaniladi:   sohani   har   xil   chekli   elementlarga   bo lib   bir   necha	
’
hisoblashlar   amalga   oshiriladi,   ushub   hisoblanganlarga   qarab   element   kattaligiga
nisbatan   bog langan   hisoblangan   kuchlanish   (ko chishi,   deformasiyalanish)	
’ ’
yasaladi,   keyin   nolga   intiluvchi   element   xajmiga   nisbatan   ekstrapolyasiya
bajariladi. Aylana xosil qilishda xatolik bo lmasa bunday ketma   ketlik masalasi	
’ –
aniq echimga alib keladi, agar
 bazis   funksiyalar   shundayki,   element   chegarasidan   o tganida   funksiyaning	
’
o zi uzluksiz va uning xosilasi p   1 tartibigacha zich qolishi, bu erda p 	
’ – –
funksiyonalda mavjud bo lgan xosila tartibining eng kattasi.	
’
 Bazis   funksiyalar   to liq   hisoblanadi     masalan,   agar   bazis   funksiyalar  	
’ – r
darajali   polinomlar   bo lsa,   u   holda   ular   darajadagi   barcha   0   dan  	
’ r   gacha
bo lgan   o zgauvchilardan   iborat   (bu   erda   to liq   funksiya   termini   xuddi	
’ ’ ’
yozilganidek   ishlatilgan,   umumiy   qabul   qilingan   to liq   funksiya   tizimi	
’
tushunchasiga to g ri kelmaydi);	
’ ’  Setka kattaligi shunday kichrayadiki, har bir keyingi element darajasi oz idan’
oldingi mos element darajasining bir bo lagini ifodalaydi.	
’
Metodning amaliy hisoblashlar  nuqtay nazaridan yana  bir  muhim  ustunligini
ko rsatib   ketamiz.   Chekli   elementlar   metodi   ko chish   sohasini   shunday	
’ ’
tanlaydiki, energetik ma noga ega bo lgan bir qancha funksiyonalni kamaytiradi.	
’ ’
Shuning   uchun   berilgan   og irlikda   kontruksiyada   berilgan   elastik   energiyani	
’
aniqligini   topish,   ko chishni   aniqligini   topishga   qaraganda   yuqori   bo lar   ekan.	
’ ’
Kuchlanishning   aniqligini   topishdan   ko ra   ko chish   (elastik   energiyada   ham)	
’ ’
aniqligini   topishdan   past   bo ladi,   sababi   kuchlanish,   differensiallangan	
’
ko chishdan   olinadigan   deformatsiyadan   aniqlanadi   va   sonli   differensiallashdagi	
’
xatoliklar sezilarli rol o ynashi mumkin.	
’
Aylana   hosil   qilish   xatoliklarini   hisobga   oladigan
bo lsak, vaziyat murakkab tus olishi mumkin (grafikda	
’
keltirilgan):   N   elementlar   soni   katta   bo lsa,   echim	
’
aylana hosil qilish xatoliklari (grafikdagi aniq echimdan
yuqori   chiziq)   ko payib   ketishi   hisobiga,   agar   moslik	
’
sharti (qora chiziq) bajarilayotgan bo lsa ham tarqab ketishi mumkin.	
’
Ushbu   xatoliklar   juda   jiddiy   hisoblanadi,   agar   chekli   elementlar   qattiq
chuzilgan   yoki   uzunliklari   0   yoki   180   gradusli   burchakka   ega   bo lsa.   Bunday	
’
vaziyatda   kuchlanib     deformalanib   hisoblangan   element   holati   yomon	
–
bog langan (juda uchqur burchak yaqin bo lagi sezilmaydi, boshqa elementlarda	
’ ’
bo lganidek)   bo ladi.   Shu  erda  boshqa   xatoliklarga  yo l   qoymaslik  maqsadida
’ ’ ’
chekli   elementlar   paketini   ishlab   chiqaruvchilar   odatda   element   va   burchak
uzunligiga  bog liq   bo lgan  joylarga   cheklov  quyishadi;   paketlarga   elementlarni	
’ ’
tekshiruvchi,   foydalanuvchiga   kerak   bo lsa   setkani   qayta   qurishni   yoki   buni	
’
avtomat   tarzda   qilishni   taklif   qiluvchi   maxsus   buyruqlar   (mesh   improving   yoki
mesh   smooting)   kiritiladi.   Shu   ma noda   chekli   elementlarning   eng   yaxshisi	
’
to g ri   ko pburchaklar   (kvadrat,   teng   tomonli   uchburchak,   kub,   to g ri	
’ ’ ’ ’ ’
tetraedr) ko rinishi hisoblanadi; elementlarning tomonlarining maqbul munosabati	
’
tahminan 1:4 gacha va burchaklari 25 dan 155 gacha. Bugungi   kunda   chekli   element   metodining   kamchiliklarini   umumiy   nazariy
baholovchi   yoqligi,   haqiyqiy   masalalarni   aniqligini   baholovchi   deyarli   birgina
metod bu grafikda ko rsatilgan turga bog liqlikni qurish (kuchlanish, ko chish’ ’ ’
natijalarining   bo lishlarga   bog liqligi)   va   uning   hisoblovchi   amaliyoti   bilan	
’ ’
ekstrapolyasiya.
Muhandis konstruktsiyasini birlashgan tugun nuqta sonlaridan iborat bo lgan	
’
bir   qancha   umumlashgan   konstruktiv   elementlardan   tashkil   topgan   deb   qarash
mumkin.   Agar   xar   bir   element   uchun   alohida   kuch   va   kochirilishi   orasidagi
bog liqlik   ma lum   bo lsa,   u   xolda   qurilish   mexanikasidagi   yaxshi   tanish	
’ ’ ’
bo lgan   usullarni   qo llash   orqali   konstruktsiyaning   to liq   yurish-turishini   va
’ ’ ’
xususiyatini ta riflashimiz mumkin.	
’
Berilgan   sohada   bog lanuvchi   nuqtalar   soni   cheksiz,   aynan   shu   elastiklik	
’
nazariyasida   sonli   natijalarni   olsih   asosiy   muammolardan   hisoblanadi.   Chekli
elementlar tushunchasi birinchi Terner tomonidan kiritilgan bo lib, o zida ushbu	
’ ’
muammoni   cheksiz   jismni   bir-biri   bilan   faqat   elementlar   chegarasiga
taqsimlanadigan     yuza   kuchlanishiga   ekvivalent   sohta   kuch   kiritiluvchi   tugun
nuqtalar   orqali   bog langan   alohida   elementlarga   ajratish   orqali   echishga   harakat	
’
qilgan. Agar  shunday ideallashtirish  mumkin bo lsa, unda masala  sonli  ravishda	
’
echiladigan qurilish mexanikasining oddiy masalasiga olib kelinadi.
Birinchi   qarashda   ushbu   nazariy   jihatdan   tushunarli   va   mumkin   bo lgan	
’
injenerlik   metod   unchalik   ishonarli   emas   ko rinadi   xususan,   alohida   bo lgan	
’ ’
elementlarning   bir-biri   orasidagi   kuch   va   ko chirish   bog lanishlari   ochiq   savol
’ ’
bo lib qolmoqda. Ushbu bosqichda chekli  elementlarning xususiyatlarini  ko rib	
’ ’
chiqqanimizdan   keyin,   keng   qo llaniladigan   umumiy   metod   hisoblash	
’
kontruktsiyasini qisqacha ta riflab ketish maqsadga muvofiq bo ladi.	
’ ’
 Keyinchalik chekli elementlar metodi boshqa shunday tipli bir nechta masalalarga
qo llanilish   mumkinligi   ko rsatiladi   va   elementlarning   qurilish   mexanikasida	
’ ’
qabul   qilingan   asosiy   xususiyatlari   formada   ifodalanadi.   Umumiy   metodning
masala echilishi va ansamblning tuzilishi qurilish mexanikasi usullariga uxshash.  Murakkab   sohaning   diskret   modelini   tuzish   masalasini   yana   bir   metod   bu
murakkab   sohani   elementar   sohalarga   ajratib   ularning   diskret   modellari   alohida
hisoblanadi va elementar sohalarning yig indisini berilgan murakkab soha diskret’
modeli   deb   olinadi.   Elementar   soha   deganda   sohaning   diskret   modelini   yaratish
algoritmi   mavjud   bo`lgan   sohalar   tushuniladi.   Elementar   sohalar   turiga   qarab
to rttaga   bo linadi.   Murakkab   soha   elementar   sohalarga   ajratilganidan   keyin	
’ ’
ularni   chekli   elementlarga   bo lib   chiqiladi   va   chekli   elementlar   tugun   nuqta	
’
koordinata  raqamlaridan  tashkil  topgan  bo ladi. Yuqorida metod  ishlash  prinsipi	
’
haqida   qisqacha   aytib   o tildi   va   shu   metod   asosida   programma   ta minoti	
’ ’
yaratiladi.
Programma   ta minoti   o z   navbatida   bir   qancha   qulayliklar   va	
’ ’
imkoniyatlarga ega bo lishi kerak: soha mutaxassisi uchun har tomonlama qulay,
’
tez va oddiy bo lishi kerak. 	
’ 1.2 §.  Uch o lchovli murakkab soha diskret modelini yaratish masalasi’
qoyilishi
Murakkab   soha   diskret   modelini   tuzishni   boshiga   nazar   soladigan   bo lsak,	
’
ulardan   birinchi   bo lib   chekli   elementlar   metodi   hozirgacha   keng   qo llanilib	
’ ’
kelmoqda.
Chekli   elementlar   metodining   kelib   chiqishi   1950     yillardagi   kosmik	
–
izlanishlar masalalariga borib taqaladi(chekli elementlar metodi 1936   yili sovet	
–
itifoqidayoq   ishlab   chiqilgan   bo lib,   metod   hisoblash   texnikasining   yaxshi	
’
rivojlanmaganligi tufayli rivojlana olmagan). Ushbu metod qurilish mexanikasidan
va elastik nazariyasidan kelib chiqqan bo lib, undau keyin uning matematik isboti	
’
olindi.
Chekli   elementlar   metodi   1963  yil   potentsiyal   energiyani   miniizatsiya   yo li	
’
masalani   differentsiyal   tenglamalar   tizimi   va   chiziqli   tenglamalar   muvozanatiga
olib keluvchi va qurilish mexanikasida ommalashgan Reley Rits metodining yana
bir   ko rinishi   ekanligi   isbotlangandan   keyin   sezilardi   ommalashishiga   turtki	
’
bo lgan.   Chekli   elementlar   metodi   minimizatsiya   protsedurasi   bilan   aloqa	
’
o rnatilganidan   keyin,   Laplas   yoki   Puasson   tenglamalarida   tavsiflangan
’
masalariga   qo llanila   boshlagan.   Chekli   elementlar   metodini   qo llash   sohasi	
’ ’
(1968   yil)   masaladagi   elementlarni   aniqlash   muallaq   bog'ichlar   metodining   biri,
bularga   Galyorkin   metodi   yoki   eng   kam   kvadratlar   metodlari   yordamida   osonlik
bilan   olish   aniqlanganidan   keyin   sezilarli   kengaydi.   Bu   chekli   elementlar
modelining   nazariy   jihatdan   asoslanishiga   juda   katta   muxim   rol   o ynadi,   bu   esa	
’
ko pgina   turli   differentsial   tenglamalarni   echishga   qo llash   imkoniyatini   berdi.	
’ ’
Shunday qilib chekli elementlar metodi, umumiy sonli metod echimiga aylandi.
Chekli   elementlar   metodi   obekt   modeli   chegaraviy   shartlari   bilan   berilgan
alohida   hosilaviy   differentsiyal   tenglamalar   tizimi   uchun   kichik   darajali   masalini
echishga mo ljallangan to rli(setkali) metod hisoblanadi.	
’ ’
Chekli elementlar metodi asosida yaratilgan programma paketlarining tuzilishi
informatsion va hisoblash bo laklaridan iborat.	
’ Informatsion   bo lagi     paketning   berilganlar   bazasi     paket   ishlatiladigan’ – –
elementlar turi haqida berilganlar(lementlar kutubxonasi), materiallar kutubxonasi,
tizim ma lumotlaridan tashkil  topgan. Fizik tarafdan ataganda paket o rnatilgan	
’ ’
katalogda joylashgan fayllar to plamidan iborat.	
’
Chekli   elementlar   metodi   paketining   hisoblash   bo lagi   umumiy   birlashgan	
’
qobiqga oid va aniq bir funktsiya ishini bajaruvchi modullar to plamidan(odatda	
’
protsessorlar   deb   nomlanadi)   tashkil   topgan(ushbu   g oyaning   amalga   oshirilishi	
’
turli paketlarda har xil   modullar oz ida alohida exe   fayllardan tashkil topgan,	
– ’ –
yoki bir fayl ostida podprogramma ko rinishida tashkil topgan bo lishi mumkin).	
’ ’
Protsessorlar   orasidan   odatda   preprotsessor     boshlang ich   berilganlarni	
– ’
tayolovchi   modul,   hisoblovchi   protsessor     solver(yoki   paketlar   uchun   keng	
–
qamrovdagi   masalalarni   echuvchi   hisoblovchi   protsessorlar)   va   postprotsessor  	
–
visuallashtiruvchi   va   natijaviy   hisoblashlarni   analiz   qiluvchi   vositalarni   ajratib
yuritadi.   Odatda   foydalanuvchi   pre   va   postprotsessor   bilan   interaktiv   rejimda	
–
ishlaydi.   Hisoblash   protsessorlar   faqatgina   mos   protsessorni   ishga   qo shish	
’
buyrug ini   berish   talab   qiladigan   bevosita   foydalanuvchi   ishtirokizis	
’
ishlaydi(ba zi   vaizyatlarda   hisoblash   parametrlari   misol   uchun   dinamika	
’
masalasining   vaqt   bo yicha   integrallash   bosqichi   uchun   oldindan   sozlash   kerak	
’
bo ladi).	
’
Chekli   elementlar   metodining(ChEM)   ko pchilik   paketlari   boshqa   paket	
’
interfayslariga ega   odatda ChEM SAPRga uxshash. Ushbu aloqa preprotsessor	
–
(geometrik   berilganlarning   import   -   eksporti)   yordamida   amalga   oshiriladi.
Shuningek   har   xil   paketlargan   axborotlar   ishlash   imkoniyatiga   ega   alohida
preprotsessorlar mavjud(ma lum paketlarning bo lagi bo lmagan).	
’ ’ ’
Qandaydir paket yordamida aniq bir masala echishda, boshlang ich, o rta va	
’ ’
oxirgi   natijaviy   berilganlar   (qatiqlik   matritsasi,   tugunlarda   ko chishlar   qiymati,	
’
elementlardagi   kuchlanish   va   boshqalar)   foydalanuvchi   belgilagan   kotalogida
fayllar toplamidan tashkil  topgan masalalar berilganlar bazasida saqlanadi. Ushbu
fayllar   odatda   bir   xil   nomga   (atalayotgan   masala   nomi)   va   har   xil   kengaytmaga
ega. Bir katalogda bir nechta masala berilganlar bazasi fayllari bo lishi mumkin.
’ Fayllarning   katta   qismi   ikkilik   hisoblanadi,   ularni   o qish   va   yozish   paket’
protsessorlari   amalga   oshiradi.   Shunday   ikkilik   fayllardan   tashqari   berilganlar
bazasi   foydalanuvchining   interaktiv   rejimda   ishlash   mobaynida   bergan   barcha
buyruqlarini   yozib   boruvchi   foydalanuvchi   harakati   protokoli   tekstli   fayliga   ham
ega.   ANSYS   paketi   bilan   ishlaganda   ushbu   fayl   .log   kengaytmasida   bo ladi.	
’
Ushbu   faylda   yozilgan   barcha   buyruqlar   foydalanuvchining   barcha   harakatlarini
tiklash   mumkin   va   masalani   to liq   tiklash   imkonini   beradi.   Shuni   ham   etiborga	
’
olish kerak:
o Fayl   protokoli   masalalar   berilganlar   bazasiga   qaraganda   kam   joy
egallayda(ko pchilik   tartibida),   shuning   uchun   diskda   joy   chegaralangan   va	
’
diskda   bir   necha   masalaning   tavsiflash   kerak   bo lsa   faqat   protokollar   faylini	
’
saqlash   tavsiya   etiladi   (ayniqsa   kollektiv   ishlatiladigan   kompyuterlarda
ishlaganda qol keladi);
o Agar   saqlangan   protokol   fayli   bo lsa,   masalani   tiklash   uchun   yangi   masala	
’
berilganlar baza yaratilib va keyingi buyriqni klaviaturadan emas balki fayldan
o qishi   buyrug I   beriladi   (dastur   oxirgi   komandani   protokol   faylidan	
’ ’
bajarganda, u avtomat tarzda buyuqni klaviaturadan kutish rejimiga o tadi); 	
’
o Saqlangan berilganlar bazasi foydalanuvchiga ishini toxtatgan joyidan uzluksiz
davom   ettirish   imkoniyatini   beradi.   Bundan   tashqari   protokol   faylidan
buyruqlarni ishlatayotganda komyuterga ushbu buyruqlarni bajarish uchun vaqt
kerak   bo ladi.   Masala   echilayotgan   ushbu   vaqt   foydalanuvchiga   sezilmasligi	
’
mumkin(soniya).
o Protokol  fayli   ixtiyoriy  tekstli  redaktor   yordamida  qayta   tahrir   qilish  mumkin,
lekin bu aniq ushbu fayldagi buyruqlarning ishlash xossalarini tushunishi talab
qilinadi. Maslalan, ketma   ket buyruqlar 	
– yuzani yaratish 1, yuzani yaratish 2,
yuzani   o chirish   1  	
’ yana   bir   yuzani   yaratish   2   buyrug I   bilan   bir   xil	’
bo lmasligi   mumkin,   sababi   yuza   yaratilganda   uning   chegara   chiziqlari,	
’
avtomat   tarzda   o zlashtiriladigan   raqamlar   ham   yaratiladi.   Ikkita   ko rib	
’ ’
chiqilgan ketma   ket  buyruqlar  
– yuza 2   ga chegaraviy chiziqlar uchun har xil
raqamlar beradi, bu keyingi buyruqlarning bajarilishiga xalaqt berishi mumkin. o Buyruqlar   olinuvchi   fayl   nomi   echilayotgan   masalaning   protokol   fayl   nomi
bilan  farq  qilishi   kerak,  aks   holda   dastur   siklga   tushib  qolishi   mumkin(chunki
bajarilayotgan buyruqlar avtomat tarzda protokol fayli oxiriga yozilib ketiladi).
Paket   funktsiyonal   imkoniyatlari   sezilarli   darajada   uning   elementlar   kutubxonasi
xajmi   aniqlaydi.   Ko rib   chiqilgan   paketlar   kutubxonasi   etarlicha   keng,’
LS DYNA paketida 50 turdan ortiq elementlar va ANSYS paketida 100dan ortiq.	
– XULOSA
Birinchi   bobda   chekli   elementlar   tarixi,   nima   uchun,   qaysi   soha   va   qay   maqsadda
qo llanilgan   va   qollanilayotganlar   bilan   tanishib   chiqdim.   shu   bilan   birga   shunga’
uxshash   qilingan   ishlar   va   ishlab   chiqrilagan   metod   algoritmlar   bilan   tanishib,
ularning ustun va kamchiliklarini ham o rganib chiqdim. O rganilgan metod asosi	
’ ’
yaratilgan   programma   paketlarning   umumiy   strukturasini   yoritib   ketdim.   Metodlar
haqida yig ilgan malumotlarga tayangan holda	
’   kompyuterning ekranida murakkab
soha   diskret   modeli   tuzish   programma   ta minotini   elementar   sohalarga   ajratish	
’
metodi asosida yaratish uchun kerakli ma lumotlarni o rgandim.	
’ ’ II    – BOB
Murakkab konfiguratsiyali sohalarni diskret modelini tuzish
2.1§.  Uch o lchovli proeksiyasi to rtburchak elementar sohaning diskret	
’ ’
modeli
Dissertatsiyaning   ushbu   bo limida   elementar   sohalarning   asosan   to rtta	
’ ’
turining diskret modelini tuzish ko rib chiqiladi.
’
Uch   o lchovli   elementar   sohalar   diskret   modelini   tuzish   asosi   uning   ikki	
’
o lchovli   diskret   modelidan   kelib   chiqadi.   Shuning   uchun   birinchi   elementar	
’
sohaning   ikki   o lchovli   diskret   modellarini   ko rib   chiqish   kerak.   Dissertatsiya	
’ ’
ishida   ikki   o lchovli   elementar   sohalarning   uchta   uch   o lchovli   ko rinishi	
’ ’ ’
ko rib chiqilgan.	
’
– ikki   o lchovli   sohani   uch   o lchovliga   surish   yordamida   yuzaga   keladi.	
’ ’
Bunda   soha   qiymatlari   XOY   tekisligiga   parallel   deb   olinadi   va   OX,   OY
o qi qiymatlari o zgarmas deb olinadi, OZ o qi qiymati o zgartiriladi.	
’ ’ ’ ’
x = x
0 , y = y
0 , z = z
0 +z
s 
Bu erda, x
0 , y
0 , z
0   tugun nuqtaning oldingi holati, z
s   surishdan keyingi holat	
–
– Surishdan   hosil   bo lgan   soha   ustidan   yana   bir   operatsiya   mavjud   va   unda	
’
ham soha XOY tekisligiga parallel deb olinadi, surilgan soha ustki tekisligi
tugun   nuqta   koordinatalarining   OX,   OY   o qlari   qiymatlari   o zgartiriladi	
’ ’
va OZ o qi qiymati o zgarmas deb olinadi.	
’ ’
x = x
0 +x
k , y = y
0 +y
k , z = z
0
Bu erda, x
0 , y
0 , z
0   tugun nuqtaning oldingi holati, x
k , y
k   surishdan keyingi holat	
– – hosil   bo lgan   uch   o lchovli   sohaning   ustki   teksligini   ma lum   bir’ ’ ’
burchakka   burish,   bunda   XOY   tekislik   qiymatlari   o zgartirilmaydi,   OZ	
’
o qi qiymatlari berilgan burchakka nisbatan o zgartiriladi.	
’ ’
x = x
0 , y = y
0 , z = z
0 +z
b
Bu erda, l
1   	
– Burchak hosil qilingan nuqta yoki to g ri chiziqdan (x,y,z) nuqtagacha	’ ’
bo’lgan masofa, α –  l
1  uzunlik va (x,y,z) nuqta orasidagi burchak.
Ikki   o’lchovli   elementar   soha   turlarini   uch   o’lchovliga   yuqorida   keltirilgan
uchta ko’rinish yordamida keltiriladi va quyida ularning umumiy algoritmi va blok
sxemalari ketma – ket ko rsatib o tiladi:	
’ ’
Birnchi turdagi elementar sohaning diskret modelini yaratish algoritmi:
1   rasm	
– 2   rasm– 3   rasm	– 4   rasm	–
Birinchi   turdagi   ikki   o lchovli   elementar   soha   diskret   modeli   1     rasmda	
’ –
keltirilgan   bo lib,   u   elementar   sohaning   uch   o lchovli   diskret   modelini   tuzish	
’ ’
uchun   kerak   bo ladi.   Qolgan   rasmlarda(2,   3,   4)   elementar   sohaning   mumkin	
’
bo lgan   uch   o lchovli   ko rinishlari   keltirilgan.   Birinchi   tur   uch   o lchovli	
’ ’ ’ ’
elementar   sohaning   diskret   modelini   yaratish   uchun   to g ri   chiziqli	
’ ’
to rtburchakning   koordinatalari((x1,   y1,   z1),   (x2,   y2,   z2),   (x3,   y3,   z3),   (x4,   y4,	
’
z4)),   0x   o qi   bo yicha(n),	
’ ’   0y   o qi   bo yicha(m),	’ ’   0z   o qi   bo yicha(l)	’ ’
bo linishlar   soni,   elementar   sohani   surish   uchun  	
’ Oz   o qidagi   uzunlik   qiymati,	’
ko chirish uchun  	
’ Ox   va   Oy   o qlari qiymatlari, burish uchun burchak qiymatlari	’
kerak bo ladi.	
’
Yuqorida   keltirilgan   parametrlarga   tayangan   xolda   uch   o lchovli   elementar	
’
sohaning diskret modeli quyidagi ketma   ketlikda amalga oshiriladi:	
–
1. (x1,   y1,   z1)   va   (x2   ,y2,   z2)   nuqtalar   orasidagi   uzunlikni   n   ta   bir   xil
uzunliklarga   ajratiladi   va   xosil   bo lgan   nuqta   koordinatalarini   M1[1	
’ …
n+1,1 3]   massiviga   saqlanadi.   Ushbu   amal   (x4,   y4,   z4)   va   (x3,   y3,   z3)	
…
nuqtlari uchun ham bajariladi va M2[1 n+1,1 3] massiviga saqlanadi.	
… …
2. paydo   bo lgan   ikkita   massivning   mos   indekslaridagi   saqlangan   nuqtalar	
’
orasidagi   uzunlikni   m   ta   bir   xil   uzunliklarga   ajratiladi   va   xosil   bo lgan	
’
nuqta koordinatalari MK massiviga saqlanadi.
3. Paydo   bo lgan   MK   massivda   saqlandan   tugun   nuqta   koordinatalariga	
’
surish,   ko chirish   va   burishdan   xosil   bo lgan   uzunliklarni   qo shib
’ ’ ’
chiqiladi   va   ushbu   uzunliklarni   l   ta   bir   xil   uzunliklarga   ajratiladi   va
BKXY[1 N,1 3] massiviga saqlanadi.
… …
4. topgan tugun nuqta koordinatalaridan diskret modelni yaratish uchun chekli
element   tugun   nuqtalarini   MN   [1 M,   1 8]   massiviga   ajratib   olinadi.	
… … Natijada   sohaning   tugun   nuqtalar   soni   N   =   (m+1)(n+1)(l+1),   chekli
elementlar soni M = m n l topiladi. Boshi
xy[4][2], mass1[m+1][2], 
mass2[m+1][2], m, n, 
MK
i = 0
i = i + 1
mass1
i,x  = xy
1,x +i(xy
4,x  – xy
1,x )/m;
mass1
i,y  = xy
1,y +i(xy
4,y  – xy
1,y )/m;
mass2
2,x  = xy
2,x +i(xy
3,x  – xy
2,x )/m;
mass2
i,x  = xy
2,x +i(xy
3,x  – xy
2,y )/m;
mass2[i][1]=xy[1][1]+i(xy[2]
[1]-xy[1][1])/m;
i ≤ 
mj = 0
j = j + 1
MK
j,x  = mass1
i,x  +j(mass2
i,x  – mass1
i,x )/n;
MK
j,x  = mass1
i,y  +j(mass2
i,y  – mass1
i,y )/n;
j ≤ 
n
1 1
j = 0
j = j + 1;k = k + 1
l
x  = sqrt((MK
j,x +x
d –x
0 ) 2
 +(MK
j,y +y
d –y
0 ) 2
);
length = l
z  + abs(l
x ) ctgα;
BKXY
k,x  = MK
j,x  + i*x
d /l;
BKXY
k,y  = MK
j,y  + i*y
d /l;
BKXY
k,z  = i*length/l;
j ≤ (n+1)( m+1)
i ≤ l
tamo
mi = 0, k = 0
i = i + 1 2.2§. Uch o lchovli proeksiyasi uchi o yilgan to rtburchak’ ’ ’
elementar sohaning diskret modeli
Ikkinchi turdagi elementar sohaning diskret modelini yaratish algoritmi:
5   rasm	
–
6   rasm	
– 7   rasm	– 8   rasm	–
Ikkinchi   turdagi   ikki   o lchovli   elementar   soha   diskret   modeli   5     rasmda	
’ –
keltirilgan   bo lib,   u   elementar   sohaning   uch   o lchovli   diskret   modelini   tuzish	
’ ’
uchun   kerak   bo ladi.   Qolgan   rasmlarda(6,   7,   8)   elementar   sohaning   mumkin	
’
bo lgan   uch   o lchovli   ko rinishlari   keltirilgan.   Ikkinchi   tur   elementar   soha	
’ ’ ’
diskret   modelini   tuzish   uchun   ( x 0   ;   y 0 )    	
– sector(ellipse,   aylana)   markazi
koordinatalari,   R1,R2    	
– sector(ellipse,aylana)   radius   uzunliklari,   n1  	–   sektor
qismining   0y   oqi   bo yicha   bo linishlar   soni,   n2  	
’ ’ –   sektor   qismining   0y   oqi bo yicha   bo linishlar   soni,   m  ’ ’ –   Sohaning   0x   oqi   bo yicha   bo linishlar   soni	’ ’
kerak bo ladi.	
’
Yuqorida   keltirilgan   parametrlarga   tayangan   xolda   uch   o lchovli   elementar	
’
sohaning diskret modeli quyidagi ketma   ketlikda amalga oshiriladi:	
–
1. ikkinchi turdagi  elementar  sohaning chorak qismi  90 gradusdan iborat
bo lgani   uchun   ushbu   burchakni   n1   va   n2   ga   teng   bo laklarga	
’ ’
ajratilib chiqiladi va quyidagi formulalardan foydalaniladi
(3)
(4)
Birinchi   keltirilgan   burchak   formulasi   bu   berigan   elementar   soha
umumiy   burchagining   bir   qismini   n1   ta   bo lakka   bo lib   chiqish	
’ ’
formulasi,   ikkinchi   formula   qolgan   qismini   n2   ta   bo lakka   ajratib	
’
chiqish formula hisoblanadi.
2. Ikkinchi   navbatda   berilgan   elementar   sohaning   ichki   kovagining
chegaraviy nuqtalarini topib array1[n1+n2][1..3] massiviga saqlashdan
iborat.  
 (5)
, (6)
Bu   erda   l     elementar   sohaning   markazidan   ichki   chegaraviy	
–
nuqtalarigacha  bo lgan  masofa,  	
’ r
1 , r
2   ichki   kovak radiyuslari,   x
i   va   y
i
ichki chegaraviy nuqtalar koordinatalari.
3. Uchinchi   bosqichda   elementar   sohaning   tashqi   chegaraviy   nuqtalarini
hisoblashdan   iborat.   Buning   uchun   uchta   tashqi   chegaraviy   nuqtani
topish kerak birinchi, n1 chi va n1+n2 chi nuqta koordinatalarini.
Ushbu   nuqtalarni   topish   uchun   (3),   (4)   va   (6)   formulalardan
foydalaniladi.   Undagi   l   uzunlikni   ikkinchi   nuqtagacha   kA,   uchinchi
nuqtaga  kB ishlatiladi.  Keyingi   qadamda  birinchi   va ikkinchi   nuqtalar orasidagi   uzunlikni   n1   taga,   ikkinchi   va   uchinchi   nuqta   orasidagi
uzunlikni   n2   ga   teng   uzunliklarga   ajratib   chiqiladi.   Xosil   bo lgan’
tashqi   chegara   nuqta   koordinatalari   array2[n1+n2][1..3]   massiviga
saqlanadi.
4. keyingi   bosqichda   birinchi   va   ikkinchi   massivgi   mos   indekslaridagi
saqlangan   nuqtalar   orasidagi   uzunliklarni   teng   m   ta   bo lakka   ajratib	
’
chiqiladi va MK massiviga saqlanadi.
5. Paydo bo lgan MK massivda  saqlandan tugun nuqta koordinatalariga	
’
surish,   ko chirish   va   burishdan   xosil   bo lgan   uzunliklarni   qo shib
’ ’ ’
chiqiladi   va   ushbu   uzunliklarni   t   ta   bir   xil   uzunliklarga   ajratiladi   va
BKXY[1 N,1 3] massiviga saqlanadi.
… …
6. topgan   tugun   nuqta   koordinatalaridan   diskret   modelni   yaratish   uchun
chekli   element   tugun   nuqtalarini   MN   [1 M,   1 8]   massiviga   ajratib	
… …
olinadi.   Natijada   sohaning   tugun   nuqtalar   soni   N   =   (m+1)(n+1)(t+1),
chekli elementlar soni M = m n t topiladi. Boshi
xy[4][2], mass1[m+1][2], 
mass2[m+1][2], m, n, 
MK
i = 0
i = i + 1
mass1
i,x  = xy
1,x +i(xy
4,x   xy–
1,x )/m;
mass1
i,y  = xy
1,y +i(xy
4,y   xy
–
1,y )/m;
mass2
2,x  = xy
2,x +i(xy
3,x   xy
–
2,x )/m;
mass2
i,x  = xy
2,x +i(xy
3,x   xy
–
2,y )/m;
mass2[i][1]=xy[1][1]+i(xy[2]
[1]-xy[1][1])/m;
i ≤ 
mj = 0
j = j + 1
MK
j,x  = mass1
i,x  +j(mass2
i,x  – mass1
i,x )/n;
MK
j,x  = mass1
i,y  +j(mass2
i,y  – mass1
i,y )/n;
j ≤ 
n
1 7. 1
j = 0
j = j + 1;k = k + 1
l
x  = sqrt((MK
j,x +x
d –x
0 ) 2
 +(MK
j,y +y
d –y
0 ) 2
);
length = l
z  + abs(l
x ) ctgα;
BKXY
k,x  = MK
j,x  + i*x
d /l;
BKXY
k,y  = MK
j,y  + i*y
d /l;
BKXY
k,z  = i*length/l;
j ≤ (n+1)( m+1)
i ≤ l
tamo
mi = 0, k = 0
i = i + 1 2.3§. Uch o lchovli proeksiyasi egri chiziqli to rtburchak elementar’ ’
sohaning diskret modeli
Uchinchi turdagi elementar sohaning diskret modelini yaratish algoritmi:
9 – rasm
10   rasm	
– 11   rasm	– 12   rasm	–
Uchinchi   turdagi   ikki   o lchovli   elementar   soha   diskret   modeli   9     rasmda	
’ –
keltirilgan   bo lib,   u   elementar   sohaning   uch   o lchovli   diskret   modelini   tuzish	
’ ’
uchun  kerak   bo ladi.  Qolgan   rasmlarda(10,  11,   12)   elementar   sohaning   mumkin	
’
bo lgan   uch   o lchovli   ko rinishlari   keltirilgan.   Ikkinchi   tur   elementar   soha	
’ ’ ’
diskret   modelini   tuzish   uchun   ( x 0   ;   y 0 )     sector(ellipse,   aylana)   markazi	
–
koordinatalari,   r1   va   r2     ichki   radiuslar,   n1     sektor  	
– – 0y   oqi   bo yicha	’
bo linishlar soni, n2   sektor  	
’ – 0y   oqi bo yicha bo linishlar soni, m   sohaning	’ ’ – 0x   oqi   bo yicha   bo linishlar   soni,   A     soha   uzunligi   va   B   –   soha   balandligi’ ’ –
kerak bo ladi.
’
Yuqorida   keltirilgan   parametrlarga   tayangan   xolda   uch   o lchovli   elementar	
’
sohaning diskret modeli quyidagi ketma   ketlikda amalga oshiriladi:	
–
1. uchinchi   turdagi   elementar   sohaning   chorak   qismi   90   gradusdan   iborat
bo lgani uchun birinchi, (3) formulasidan foydalanib umumiy burchakning	
’
bir qismini n1 ta bo lakka bo lib chiqiladi, (4) formuladan qolgan qismini	
’ ’
n2 burchaklarga ajratib chiqiladi.
2. Ikkinchi   navbatda   esa   berilgan   elementar   sohaning   ichki   chegaraviy
nuqtalarini   topib   array1[n1+n2][1..3]   massiviga   saqlanadi.   Chegaraviy
nuqtalarni (5), (6) formulalaridan foydalaniladi.
3. Uchinchi   bosqichda   elementar   sohaning   tashqi   chegaraviy   nuqtalarini
aniqlash.   Buning   uchun   ham   (5),   (6)   formulalaridan   foydalaniladi.   Xosil
bo lgan   tashqi   chegara   nuqta   koordinatalar   array2[n1+n2][1..3]   massiviga	
’
saqlanadi.
4. keyingi   bosqichda   birinchi   va   ikkinchi   massivning   mos   indekslaridagi
saqlangan   nuqtalar   orasidagi   uzunliklarni   m   ta   teng   bo lakka   ajratib	
’
chiqiladi va MK massiviga saqlanadi.
5. Paydo   bo lgan   MK   massivda   saqlandan   tugun   nuqta   koordinatalariga	
’
surish,   ko chirish   va   burishdan   xosil   bo lgan   uzunliklarni   qo shib
’ ’ ’
chiqiladi   va   ushbu   uzunliklarni   t   ta   bir   xil   uzunliklarga   ajratiladi   va
BKXY[1 N,1 3] massiviga saqlanadi.
… …
6. topgan tugun nuqta koordinatalaridan diskret modelni yaratish uchun chekli
element   tugun   nuqtalarini   MN   [1 M,   1 8]   massiviga   ajratib   olinadi.	
… …
Natijada   sohaning   tugun   nuqtalar   soni   N   =   (m+1)(n+1)(t+1),   chekli
elementlar soni M = m n t topiladi. Boshi
xy[4][2], mass1[m+1][2], 
mass2[m+1][2], m, n, 
MK
i = 0
i = i + 1
mass1
i,x  = xy
1,x +i(xy
4,x  – xy
1,x )/m;
mass1
i,y  = xy
1,y +i(xy
4,y  – xy
1,y )/m;
mass2
2,x  = xy
2,x +i(xy
3,x  – xy
2,x )/m;
mass2
i,x  = xy
2,x +i(xy
3,x  – xy
2,y )/m;
mass2[i][1]=xy[1][1]+i(xy[2]
[1]-xy[1][1])/m;
i ≤ 
mj = 0
j = j + 1
MK
j,x  = mass1
i,x  +j(mass2
i,x  – mass1
i,x )/n;
MK
j,x  = mass1
i,y  +j(mass2
i,y  – mass1
i,y )/n;
j ≤ 
n
1 1
j = 0
j = j + 1;k = k + 1
l
x  = sqrt((MK
j,x +x
d –x
0 ) 2
 +(MK
j,y +y
d –y
0 ) 2
);
length = l
z  + abs(l
x ) ctgα;
BKXY
k,x  = MK
j,x  + i*x
d /l;
BKXY
k,y  = MK
j,y  + i*y
d /l;
BKXY
k,z  = i*length/l;
j ≤ (n+1)( m+1)
i ≤ l
tamo
mi = 0, k = 0
i = i + 1 2.4§. Uch o lchovli proeksiyasi sektor elementar sohaning diskret’
modeli
To rtinchi turdagi elementar sohaning diskret modelini yaratish algoritmi:	
’
13 – rasm
14   rasm	
– 15   rasm	– 16   rasm	–
To rtinchi   turdagi   ikki   o lchovli   elementar   soha   diskret   modeli   13     rasmda	
’ ’ –
keltirilgan   bo lib,   u   elementar   sohaning   uch   o lchovli   diskret   modelini   tuzish	
’ ’
uchun  kerak   bo ladi.  Qolgan   rasmlarda(14,  15,   16)   elementar   sohaning   mumkin	
’
bo lgan   uch   o lchovli   ko rinishlari   keltirilgan.   Ikkinchi   tur   elementar   soha	
’ ’ ’
diskret   modelini   tuzish   uchun     sohaning   markaziy   koordinatalari,  
ichki   radiuslar,  
  balandligi,     uzunligi,   m    	
– Oy   oqi   bo yicha   bo linishlar	’ ’
soni,  n1, n2   Oy	
–
  oqi bo yicha bo linishlar soni kerak bo ladi.	’ ’ ’ Yuqorida   keltirilgan   parametrlarga   tayangan   xolda   uch   o lchovli   elementar’
sohaning diskret modeli quyidagi ketma   ketlikda amalga oshiriladi:	
–
1. To rtinchi   tur   elementar   soha   diskret   modeli   ikkita   bo lakka   bo lib	
’ ’ ’
hisoblanadi.   Birinchi   bo lak   birinchi   turga   mansub   bo lgan   elementar	
’ ’
soha(5     rasm)  	
– r1,r2   tomonli   to’rtburchak.   Birinchi   turdagi   elementar
sohani   hisoblovchi   funktsiyaga   n1,   n2   parametrlarni   kiritib   uning   diskret
modeli   olinadi   va   elementar   sohaning   qo shilishi   kerak   bo lgan   tugun	
’ ’
nuqta koordinatalari array1[n1+n2][1..3] massiviga saqlanadi.
2. umumiy   elementar   sohaning   ikkinchi   bo lagi(6     rasm)  
’ – a,b   radiusli
ellipsning   chorak   qismi   deb   olinadi   va   (3)   formuladan   foydalanib   umumiy
burchakning   bir   qismi   n1   ta   bo lakka   bo lib   chiqiladi,   (4)   formuladan	
’ ’
qolgan   qismini   n2   burchaklarga   ajratib   chiqiladi   va   array2[n1+n2][1..3]
massiviga saqlanadi.
3. keyingi   bosqichda   birinchi   va   ikkinchi   massivning   mos   indekslaridagi
saqlangan   nuqtalar   orasidagi   uzunliklarni   m   ta   teng   bo lakka   ajratib	
’
chiqiladi va MK massiviga saqlanadi.
4. Paydo   bo lgan   MK   massivda   saqlandan   tugun   nuqta   koordinatalariga	
’
surish,   ko chirish   va   burishdan   xosil   bo lgan   uzunliklarni   qo shib
’ ’ ’
chiqiladi   va   ushbu   uzunliklarni   t   ta   bir   xil   uzunliklarga   ajratiladi   va
BKXY[1 N,1 3] massiviga saqlanadi.
… …
5. topgan tugun nuqta koordinatalaridan diskret modelni yaratish uchun chekli
element   tugun   nuqtalarini   MN   [1 M,   1 8]   massiviga   ajratib   olinadi.	
… …
Natijada   sohaning   tugun   nuqtalar   soni   N   =   (m+1)(n+1)(t+1),   chekli
elementlar soni M = m n t topiladi.(7   to rtinchi tur elementar soha)
– ’ Boshi
xy[4][2], mass1[m+1][2], 
mass2[m+1][2], m, n, 
MK
i = 0
i = i + 1
mass1
i,x  = xy
1,x +i(xy
4,x  – xy
1,x )/m;
mass1
i,y  = xy
1,y +i(xy
4,y  – xy
1,y )/m;
mass2
2,x  = xy
2,x +i(xy
3,x  – xy
2,x )/m;
mass2
i,x  = xy
2,x +i(xy
3,x  – xy
2,y )/m;
mass2[i][1]=xy[1][1]+i(xy[2]
[1]-xy[1][1])/m;
i ≤ 
mj = 0
j = j + 1
MK
j,x  = mass1
i,x  +j(mass2
i,x  – mass1
i,x )/n;
MK
j,x  = mass1
i,y  +j(mass2
i,y  – mass1
i,y )/n;
j ≤ 
n
1 1
j = 0
j = j + 1;k = k + 1
l
x  = sqrt((MK
j,x +x
d –x
0 ) 2
 +(MK
j,y +y
d –y
0 ) 2
);
length = l
z  + abs(l
x ) ctgα;
BKXY
k,x  = MK
j,x  + i*x
d /l;
BKXY
k,y  = MK
j,y  + i*y
d /l;
BKXY
k,z  = i*length/l;
j ≤ (n+1)( m+1)
i ≤ l
tamo
mi = 0, k = 0
i = i + 1 2.5§. Murakkab soha diskret modelini yaratish algoritmi
Murakkab   sohaning   barcha   elementar   sohalari   hisoblashlaridan   keyin   qoshish
amali boshlanadi. Ushbu amalda asosan chegarada yotuvchi umumiy nuqtalarning
aniqlash,   tugun   nuqta   va   chekli   elementlar   tugunlari   qayta   raqamlanishlar   ustida
kechadi.
Natijada quyidagi soha kelib chiqadi
Qo shish jarayonida birinchi soha toliq o zgarishlarsiz ko chiriladi, ikkinchi soha’ ’ ’
uchun qayta raqamlashni amalga oshirish kerak bo ladi.	
’
1.   qo shiluvchi   ikkita   sohaning   umumiy   tugun   nuqtasini   topish   kerak.   Mos	
’
keluvchi   tugun   nuqta   koordinatalarini   keyinchalik   solishtirish   uchun   massivga
saqlab qo yiladi.	
’
2. Qo shish jarayonida ikkinchi soha mos kelgan tugunlari birinchi soha tugunlari	
’
raqami   bilan   raqamlanadi,   ikkinchi   sohaning   qolgan   tugunlari   quyidagi   formula
yordamida qayta raqamlanadi:
N = N
i  +  i   q	
–
Bu erda,  N
i   	
– birinchi soha  tugun maksimal nuqtalar nuqtalar soni
i   ikkinchi sohaning qayta raqamlanishi kerak bo lgan tugun nuqta raqami	
– ’
q     ikkinchi   sohaning   mos   tugun   nuqta(chegaraviy)   raqamining   i   raqamidan
–
nechtasidan kichikligi.
Bu jarayon ikkinchi soha tugun nuqtalari toliq qayta raqamlanishigacha davom etadi.
Demak, qo shilgan ikkita soha diskret modeli umumiy ko rinish quyidagich:	
’ ’
M = M1 + M2, N = N1 + N2 - k,
MK[N], MN[M] Bu   erda,   k     mos   keluvchi   tugun   nuqtalar   soni,   MK[N]     tugun   nuqta– –
raqamlanishini va koordinatalarini saqlovchi massiv Boshi
xy[4][2], mass1[m+1][2], 
mass2[m+1][2], m, n, 
MK
i = 0
i = i + 1
mass1
i,x  = xy
1,x +i(xy
4,x  – xy
1,x )/m;
mass1
i,y  = xy
1,y +i(xy
4,y  – xy
1,y )/m;
mass2
2,x  = xy
2,x +i(xy
3,x  – xy
2,x )/m;
mass2
i,x  = xy
2,x +i(xy
3,x  – xy
2,y )/m;
mass2[i][1]=xy[1][1]+i(xy[2]
[1]-xy[1][1])/m;
i ≤ 
mj = 0
j = j + 1
MK
j,x  = mass1
i,x  +j(mass2
i,x  – mass1
i,x )/n;
MK
j,x  = mass1
i,y  +j(mass2
i,y  – mass1
i,y )/n;
j ≤ 
n
1 XULOSA
Ikkinchi   bobda   murakkab   soha   elementar   soha   turlarini   ko rib   chiqdim’
va uning ikki o lchovli diskret modeli yordamida uch o lchovliga uning	
’ ’
proeksiyalari   yordamida   o tqazish   usullarini,   algoritm   va   blok	
’
sxemalarni   yoritib   ketdim   va   o rgandim.   Programma   ta minoti   uchun	
’ ’
kerak   bo lgan   barcha   ma lumotlarga   va   algoritmlarni   o rganib	
’ ’ ’
chiqdim. III -  BOB
Murakkab soha diskret modelini tuzuvchi programma ta minoti’
3.1§. Programma ta minotining asosiy modullari	
’
Uch   o lchovli   murakkab   konfiguratsiyalik   soha   diskret   modelini   tuzuvchi	
’
programma   ta minoti   soha   mutaxassislari   uchun   yordamchi   konstruktor	
’
vazifasiga   mo ljallangan.   Konstruktor   borland   C++   builder   6.0   dasturlash   tili
’
yordamida yaratilgan bo lib, undagi sohani visuallashtirish OpenGL kutubxonasi	
’
imkoniyatlaridan foydalanilgan. Konstruktor murakkab sohani elementar sohalarga
ajratib   ularning   diskret   modellarini   qo shish   orqali   berilgan   murakkab   sohaning	
’
diskret modelini hisoblab beradi. Programma ta minotida murakkab soha diskret	
’
modelini   yaratish   uchun   visual   ravishda   ishlash   ya ni   sichqoncha   yordamida	
’
yo lga   qo yilgan.   Konstruktor   elementar   sohaga   kerak   bo lgan   parametrlarni	
’ ’ ’
ekran koordinatalar yordamida xosil qiladi.
1   rasm. Programma ta minotning umumiy ko rinishi	
– ’ ’ 1  rasm. Konstruktor asosiy tugmalari–
Konstruktor bilan ishlashda murakkab soha diskret modelini yaratishda asosan
2     rasmda   keltirilgan   tugmalar   yordamidan   foydalaniladi   va   ularning   qanday	
–
amallarni bajarishi haqida quyida qisqacha tushuncha berib ketiladi:
Tugmalar   haqida   tushuncha   bermasdan   oldin   konstruktorning   asosi   bo lgan	
’
tugmalar   haqida   aytib   o tish   lozim   bo ladi.   Murakkab   sohani   diskret   modelini	
’ ’
tuzish uchun oldin uning ikki o lchovli visual ko rinishin chizish kerak bo ladi.	
’ ’ ’
Ushbu   chizmani   chizish   uchun   to rtta   tugma   yaratilgan   bo lib,   ularning	
’ ’
birinchisi ikkita nuqtani to g ri chiziq bilan bog laydi, ikkinchisi ikkita nuqtani	
’ ’ ’
ellisning   uchinchi   yoki   to rtinchi   chorak   qismlari   sifatida   bog laydi,   uchinchisi
’ ’
ikkita nuqtani ellipsening bitinchi yoki ikkinchi chorak qismlari sifatida bog laydi	
’
va to rtinchi tugma bu nuqta qo shish amallarini bajaradi.	
’ ’
(1) Murakkab   soha   visual   ko rinishini   yaratish   uchun   ishlatiladigan   tugma	
’
hisoblanadi   va   rogramma   ta minotining   asosi   bo lgan   tugmalardan   biri	
’ ’
bo lib, u ikkita nuqtani to g ri chiziq orqali bog laydi.	
’ ’ ’ ’
(2) Murakkab   soha   visual   ko rinishini   yaratish   uchun   ishlatiladigan   tugma	
’
hisoblanadi   va   rogramma   ta minotining   asosi   bo lgan   tugmalardan   biri	
’ ’
bo lib,  u   ikkita   nuqtani   ellipsning   uchinchi   yoki   to rtinchi   chorak   qismlari	
’ ’
sifatida bog laydi.	
’ (3) Murakkab   soha   visual   ko rinishini   yaratish   uchun   ishlatiladigan   tugma’
hisoblanadi   va   rogramma   ta minotining   asosi   bo lgan   tugmalardan   biri	
’ ’
bo lib,   u   ikkita   nuqtani   ellipsning   birinchi   yoki   ikkinchi   chorak   qismlari	
’
sifatida bog laydi.	
’
(4) Murakkab   soha   visual   ko rinishini   yaratish   uchun   ishlatiladigan   tugma	
’
hisoblanadi   va   rogramma   ta minotining   asosi   bo lgan   tugmalardan   biri	
’ ’
bo lib,   u   murakkab   soha   visual   ko rinishiga   nuqta   qo shish   uchun	
’ ’ ’
ishlatiladi.
Quyidagi   tugmalar   haqida   tushuncha   bermasdan   oldin   yana   bir   tushunchaga
to xtalib   o tish   kerak   bo ladi.   Ular   uch   o lchovli   elementar   soha   diskret	
’ ’ ’ ’
modelini tuzish amalini bajaruvchi tugmalar hisoblanadi. Elementar sohalar to rt	
’
turga   bo linadi   va   ularning   diskret   modelini   tuzish   amali   alohida   tugmalarga	
’
ajratilgan:
(5) Birinchi turdagi elementar soha diskret modelini tuzish
amalini   bajaradi.     rasmda   tugma   bosilgandan   keyin
ko rinish,   ushbu   kichik   dialog   oynachasidan   birinchi
’
tur elementar soha diskret modelini tuzish uchun kerak
bo ladigan   parametrlarni   olish   imkoniyatini   beradi.
’
Undagi 0   ekrandan o qib olinadigan koordinatalarni	
– ’
sanovchi   schyotchik,   m,   n   va   l   parametr   qiymatlarini
klaviatura yordamida kiritish lozim bo ladi. Ushbu tur	
’
diskret modelini tuzish uchun to rtta nuqta koordinatalari kerak bo ladi.	
’ ’
(6) Ikkinchi turdagi elementar soha diskret modelini tuzish
amalini   bajaradi.     rasmda   tugma   bosilgandan   keyin
ko rinish,   ushbu   kichik   dialog   oynachasidan   ikkinchi	
’
tur  elementar  soha diskret  modelini tuzish uchun kerak
bo ladigan   parametrlarni   olish   imkoniyatini   beradi.
’
Undagi 0   ekrandan o qib olinadigan koordinatalarni	
– ’
sanovchi schyotchik, m, n1 va n2 parametr qiymatlarini klaviatura   yordamida   kiritish   lozim   bo ladi.   Ushbu   tur   diskret   modelini’
tuzish uchun beshta nuqta koordinatalari kerak bo ladi.	
’
(7) Uchinchi   turdagi   elementar   soha   diskret   modelini   tuzish   amalini   bajaradi.
Tugma   bosilgandan   keyin,   uchinchi   elementar   soha   diskret   modelini   tuzish
uchun   kerak   bo ladigan   parametrlarini   olish   imkoniyatini   beruvchi   kichik	
’
dialog   oynachasi   chiqadi.   Ushbu   tur   diskret   modelini   tuzish   uchun   to rtta	
’
nuqta koordinatalari kerak bo ladi.	
’
(8)   To rtinchi   turdagi  elementar  soha  diskret  modelini   tuzish  amalini  bajaradi.	
’
Tugma bosilgandan keyin, To rtinchi elementar soha diskret modelini tuzish	
’
uchun   kerak   bo ladigan   parametrlarini   olish   imkoniyatini   beruvchi   kichik	
’
dialog   oynachasi   chiqadi.   Ushbu   tur   diskret   modelini   tuzish   uchun   ikkita
nuqta koordinatalari kerak bo ladi.	
’
(9) Ushbu   tugma   uch   o lchovli   elementar   sohalar	
’
diskret   modellari   tuzish   amalidan   o tganidan   keyin	
’
natijaviy   murakkab   soha   diskret   modelini   topish
uchun   elementar   soha   diskret   modellarini   yig ish	
’
amalini ketma   ket bajaruvchi hisoblanadi. Rasmda	
–
tugma   bosilgandan   keyingi   ko rinish   keltirilgan	
’
bo lib,   undagi   birinchi   va   ikkinchi   listbokslarda	
’
diskret   modellari   tuzilgan   sohalar   ro yxati   turadi.	
’
Ulardan qo shilishi kerak bo lgan sohalar tanlanadi	
’ ’
va   qo shish   tugmasi   bosiladi.   Eslatib   o tiladigan   vaziyat   bu   sohalar	
’ ’
qo shilgandan   keyin,   birinchi   ro yxatdagi   tugun   nuqta   raqamlanishi	
’ ’
o zgarmasdan,   ikkinchi   ro yxatdagi   soha   tugun   nuqta   raqamlanishi
’ ’
oz gartiriladi   va   o xshashlar   olib   tashlanadi.   Tugun   nuqta   qo shilishi
’ ’ “ ” ’
kerak bo lgan tugun nuqtalar sonini ko rsatadi.	
’ ’
(10) Ushbu   tugma   murakkab   sohaning   ikki   o lchovli   visual   ko rinishi	
’ ’
chizilganidan keyingi amalni bajaruvchi hisoblanadi. Tugma murakkab sohani
uch   o lchovliga   visual   ko rinishiga   o tqazish   amalini   bajaradi.   Rasmda	
’ ’ ’
tugma   bosilgandan   keyingi   ko rinish   keltirilgan.   Programma   ta minotida	
’ ’ murakkab   sohaning   uch   o lchovliga   o tqazishning   surish,   ko chirish   va’ ’ ’
burish   amallari   ko rib  chiqilgan  bo lib,  va  u  ushbu	
’ ’
tugma   yordamida   amalga   oshiriladi.   Surishda   XOY
tekisligiga   parallel   bo lgani   uchun   faqat  	
’ Oz   oqi
uzunligi   kerak   bo ladi.   Rasmdagi   birinchi   tugma	
’
uzunlikni   visual   ravishda   olish   imkonini   beradi.
Surishda   Ox   va   Oy   oqi   qiymatlarini   o zgartirshning	
’
o zi   etarli   bo ladi.   Rasmdagi   ikkinchi   tugma	
’ ’
surishni   visual   ravishda   amalga   oshirish   imkonini
beradi.   Burishda   burchak   qiymati   va   tekislik
boshlang ich   chizig i   kerak.   Rasmdagi   uchinchi   tugma   boshlang ich	
’ ’ ’
chiziqni   visual   ravishda   olish   imkonini   beradi.   Yuqorida   keltirilgan   amallar
ketma     ketligini   visual   ravishda   va   klaviaturadan   kiritish   ham   bajarish
–
mumkin.
(11) Ushbu tugma diskret modeli yaratilgan sohaning visual ko rinishini ko rish	
’ ’
imkoniyatini beradi. Tugma bosilganidan keyin dastur diskret modeli tuzilgan
sohani ekranda OpenGL kutubxonasi yordamida visuallashtiradi.
(12) Tugma konstruktorda ishlash
mobaynida   natijalarni
ko rish  imkoniyatini  beradi.	
’
Rasmda   tugmani   bosgandan
keyingi   ko rinish	
’
keltirilgan.   Oyna   sohalarni
tanlash   listboksidan   diskret
modeli   tuzilgan   soha
ro yxati   turadi.   Memoda	
’
tanlangan   soha   haqida
ma lumot   keltirilgan
’
bo ladi.   Unda   tanlangan
’
soha   N   tugunlar   soni   va   M chekli   elementlar   sonini   ko rsatadi.   Birinchi   tablitsada   tanlangan   sohaning’
tugun   nuqta   koordinatalari   keltirilgan.   Ikkinchi   tablitsada   chekli   elementlar
koordinatalar raqamlarini saqlaydi. 3.2§. Programma ta minotining strukturasi’
Konstruktorda   uch   o lchovli   murakkab   soha   diskret   modelini   tuzush   uchun   bir	
’
necha amallarni ketma   ket ravishda bajarish kerak.	
–
- konstruktor   ishga   tushganidan   keyingi   birinchi   qilinadigan   amal   bu
murakkab   sohaning   ikki   o lchovli   visual   ko rinishini   chizishdan   iborat.	
’ ’
Dasturda visual ko rinishni to liq ifodalash uchun	
’ ’
bir   necha   chiziq   chizish   ko rinishi   keltirilgan.	
’
Ushbu   amalni   bajarish   to rtta   tugma   yordamida	
’
bajariladi.   Bulardan   biri   to g ri   chiziq   bo lib,
’ ’ ’
bunda   ikkita   nuqtani   to g ri   chiziq   orqali
’ ’
bog laydi.   Ikkinchisi   ellipsning   chorak   qismini	
’
chizuvchi   chiziq   bo lib,   bunda   ellipsning   to rtta   choragi   bo lgani   bilan	
’ ’ ’
ularni   chizishda   sakkizta   yunalish   yuzaga   keladi   shuning   uchun   ellips
choraklarini   chizish   amalini   ikkita   tugmaga   ajratish   maqsadga   muvofiq.
Bunga   misol   sifatida   rasmda   keltirilgan   ikkinchi   tugmaning   toliq   chizilishi
keltirilgan   va   u   ellipsning   uchinchi   va   to rtinchi   choragini   chizishga	
’
mo ljallangan. Misolda to rtt nuqta o z aro bog lanishlarida birinchi va	
’ ’ ’ ’
ikkinchi nuqtalar bilan uchinchi va to rtinchi nuqtalar bitta chorak chizilgan	
’
bo lsa   ham   ulardagi   farq   birida   pastdan   yuqoriga,   ikkinchisi   yuqoridan	
’
pastga   yunaltiriganida.   Uchinchi   tugma   esa   ellipsning   qolgan   ikkita
choragini ya ni birinchi va ikkinchi choraklarini chizadi. To rtinchi tugma	
’ ’
esa asosan elementar soha diskret modelini tuzish uchun yordam beradigan
nuqtani   qo yib   chiqadi.   Yuqorida   aytib   o tilgan   tugmalar   ishlatilganidan
’ ’
keyin  dasturda  mavjud  bo lgan  stringGrid2  tablitsasiga   chiziq  kodi   ya ni	
’ ’
to g ri  chiziqqa   0, ellips chizig iga(3   4 chorak)    1, ellips qolgan	
’ ’ – ’ – –
chizig iga(1     2   chorak)     2   kodlarini   va   bog langan   ikkita   nuqta	
’ – – ’
koordinatalarini   saqlaydi.   Tablitsa   ekrandan   koordinatalarni   olish   va
elementar   soha   choragini   hisoblash   maqsadida   ishlatiladi.   Ushbu   amalni
amalga   ishirishda   asosiy   muammolarning   biri,   bu   konstruktor
foydalanuvchisining   ekrandan   oladigan   koordinatalari   hisoblanadi.   Misol uchun   elementar   soha   koordinatalarini   ekrandan   olgandan   keyin,   uni
foydalanuvchi  qaysi  taribta va qanday ketma   ketlikda olgani noma lum– ’
bo lib   qoladi.   Ekrandan   olingan   nuqtalarining   qaysi   biri   sohaning	
’
balandligini   yoki   uzunligini   berishini   bilish   qiyin   hisoblanadi.   Ushbu
muammoni   bir   necha   echish   usullarini   ko rib   chiqildi   va   quyidagi   echish	
’
usuli   foydalanildi.   Masalani   echish   elementar   sohaning   turlarini   chizuvchi
chiziq   kodlari   va   ularning   ketma     ketligidan   echiladi.   Ikkinchi   tur	
–
elementar sohasida indekslari ketma   ket joylashgan birgina ellips chorak
–
qismini   chizuvchi   chiziq   mavjud,   bu   chiziq   orqali   soha   qaysi   chorak
qismdanligini aniqlash mumkin. Qolgan uchta nuqta ketma   ketligini bir 	
– –
biriga perpendikulyar chiziq orqali joylashishidan topish mumkin. Uchinchi
turda   elementar   sohaning   qaysi   chorak   qismdanligini   ellips   chorak
chizig idan   topish   mumkin.   Foydalanuvchi   kiritgan   nuqtalarni   tartiblash	
’
uchun ularning joylashish ketma   ketligidan foydalaniladi. To rtinchi tur	
– ’
sohasining   qaysi   chorak   qismidan   ekanligining   topishning   o zi   etarli	
’
hisoblanadi.
- Murakkab sohaning ikki o lchovli visual ko rinishini chizilganidan keyin,	
’ ’
uni   uch   o lchovli   murakkab   soha   visual   ko rinishiga   keltirish   kerak.	
’ ’
Dasturda buning surish, ko chirish va burish amallari qo llanilgan. Ushbu	
’ ’
amallarni   qo llagandan   keyin   uning   qiymatlarini   stringGrid8   tablitsasiga	
’
saqlanadi  va undagi qiymatlardan elementar soha diskret modeli tuzilganda
foydalaniladi.   Surishdan   keyin   tablitsaga   Oz   oqi   qiymati,   ko chirishda  	
’ Ox
va  Oy  oqi qiymatlariga qo shiladigan qiymatlari, burishda XOY tekisligiga	
’
burchak qiymati va burchak joylashgan to g ri chiqiz qiymatlari saqlanadi.	
’ ’
- Murakkab sohani uch o lchovli visual ko rinishini vujudga keltirilganidan	
’ ’
keyin,   murakkab   sohani   elementar   sohalarga   ajratiladi   va   uch   o lchovli	
’
elementar   soha   diskret   modellarini   tuzish   amali   bajariladi.   Ushbu   amalni
bajarish uchun bir nechta tugmalar ishlatiladi  va ular elementar soha turiga
qarab   bo linadi   ya ni   to rtta   tugma.   Ularning   barchasiga   birigina	
’ ’ ’
groupBox1   xizmat   qiladi.   Turlarni   bosilgan   tugmasiga   qarab   ajratib   oladi. GroupBox1   da   stringGrid1   tablitsasi   mavjud   bo lib,   unda   elementar   soha’
turi   uchun   kerak   bo lgan   stringGrid2   tablitsasida   saqlangan   nuqta	
’
koordinatalarining   indeks   raqami   saqlanadi.   Elementar   soha   turining   qaysi
chorakda  yotishini  nuqta  oralig idagi   chiziq  kodi   orqali  aniqlash  mumkin.	
’
Shu   tariqa   elementar   soha   diskret   modelini   tuzishda   kerak   bo ladigan	
’
parametrlarni   groupBox1   dan   olish   mumkin.   Elementar   sohaga   kerak
bo lgan   barcha   parametrlarni   kiritganidan   keyin,   berilgan   parametrlar	
’
elementar soha turiga qarab funktsiyalariga yuboriladi va funtsiya elementar
soha   diskret   modeliga   tegishli   tugun   nuqta   koordinatalari   va
raqamlanishlarini   stringGrid4   tablitsasiga   yozib   chiqadi,   chekli   element
koordinata   raqamlarini   stringGrid3   tablitsasiga   yozadi,   bunda
raqamlanishlarni  stringGrid4 tablitsasidan   oladi  va  dasturda  visuallashtirish
uchun   kerak   bo ladigan   polygon   koordinata   raqamlarini   stringGrid5	
’
tablitsasiga   saqlaydi.   Dasturda   polygon   deganda   OpenGL   sohani   chizish
uchun   soha   qobig i   koordinatalarini   alohida   tablitsaga   saqlaydi,   bu	
’
OpenGL   kutubxonasi   ishlash   tezligini   oshirish   uchun   xizmat   qiladi.     Soha
haqida   ma lumotlar   ya ni   tugun   nuqtalar   soni,   m,   n,   l,   stringGrid4	
’ ’
tablitsasida   sohaga   tegishli   nuqta   koordinatalarning   boshi   va   oxirgi
indekslari,   stringGrid3   tablitsasidagi   sohaga   tegishli   chekli   elementlar
koordinata   raqamlarining   boshi   oxirgi   indekslarini,   stringGrid5   tablitsadan
ham   boshi   va   oxirgi   indekslarni   saqlaydi.   Funktsiya   Oz   oqi   qiymatlarini
stringGrid8 tablitsadan oladi.
- Mavjud elementar soha diskret modellari tuzilganidan keyin, ularni ketma 	
–
ket   qo shish   amalini   bajarish   kerak.   Bu   jarayon   kerakli   murakkab   soha	
’
diskret modelini olguncha yoki bir soha qolguncha davom ettiriladi. Ushbu
amalni   bajarish   uchun   boshqa   amallarga   qaraganda   ko proq   tablitsa	
’
ishlatiladi.   Amalni   bajarish   uchun   faqat   listbox1   va   listbox2   dan
q oshiluvchi  sohalarni  berlgilashning  o zi  etarli  hisoblanadi.  Lekin uning	
’ ’
ortidagi qatnashuvchi tablitsalar to liq qayta raqamlashdan o tadi. Birinchi	
’ ’
navbatda   belgilangan   ikkita   sohaning   uxshash   tugun   nuqta   koordinatalari topiladi   va   ularning   indekslari   stringGrid7   tablitsasiga   saqlanadi.   Mavjud
sohalar   haqida   ma lumotlarni   stringGrid6   tablitsasidan   oladi   va   olingan’
ma lumotlardan   foydalangan   xolda   stringGird4   tablitsasidagi	
’
koordinatalarini   stringGrid9   tablitsasiga   ko chirib   chiqadi,   bu   tablitsada	
’
saqlanayotgan koordinatalarining raqamlari o zgarishi sababli uning oldingi
’
raqamlanishini ham o zida saqlab boradi, bu saqlash maqsad chekli element	
’
va   dasturdagi   polygon   ko rinishlarni   o zida   saqlovchi   tablitsalar	
’ ’
stringGrid4   tablitsasiga   bog liq   bo lgani   uchun   amalga   oshiriladi.   Agar	
’ ’
stringGrid6   dagi   soha   listbox2   dagi   tanlangan   sohaga   teng   bo lsa   u   xolda	
’
soha   koordinatalar   ro yxatidan   birinchi   soha   koordinatalariga   uxshashlari	
’
olib   tashlanadi   va   qayta   raqamlanadi.   Har   bir   soha   stringGrid9   tablitsasiga
ko chirilib   qayta   raqamlangandan   keyin   stringGird6   tablitsasidan   soha	
’
haqidagi   ma lumotlarni   qayta   yozib   chiqadi.   Keyin   stringGird4	
’
tablitsasidan   barcha   koordinatalari   o chiriladi   va   stringGird9   tablitsasidan	
’
qayta   yoziladi.   StringGrid3   va   StringGrid5   tablitsadagi   saqlangan   oldingi
raqamlanishlar   stringGird9   tablitsasi   yordamida   qayta   raqamlanadi.   Shu
tariqa qo shish amali ketma   ket ravishda bajariladi.	
’ –
Visual   ko rinishni   GPH   tugmasi   orqali   ko rish   mumkin.   MNK   tugmasida	
’ ’
soha   haqida   kerakli   ma lumotlarni   korish   mumkin.   Natijaviy   uch   o lchovli	
’ ’
murakkab konfiguratsiyalik soha diskret modelini  M K Z .txt  va  M N Z .txt	
“ ” “ ”
fayllardan olish mumkin. 3.3§. Test masalasini echish va natijalarni tahlil qilish
Murakkab   sohaning   diskret   modelini   elementar   sohalarga   ajratib   hisoblash
metodi   asosida   yaratilgan   programma   ta minotini   testlash   uchun   quyidagi’
murakkab   sohani   ushbu   konstruktor   yordamida   diskret   modelini   tuzib   va
natijalarini tahlil qilish kerak bo ladi.	
’
Masalan,   quyidagi   rasmda   keltirilgan   murakkab   soha   berilgan   bo lsin,	
’
sohaning diskret modelini topish uchun birinchi navbatda uni elementar sohalarga
ajratib chiqish kerak bo ladi	
’
Demak,   murakkab   sohaning   elementar   sohalarga   ajratib   chiqilganidan   keyin
quyidagi   ko rinishga   ega   keltiriladi   va   berilgan   soha   ettita   o yilgan	
’ ’
to rtburchak,   to rtburchak va ikkita sektor turlaridan iborat bo lgan elementar	
’ ’ ’
sohalarga ajratib chiqildi. Shunday qilib murakkab soha 10 ta elementar sohalarga
ajratib  chiqildi. Murakkab  soha  dikret  modeli   ushbu  10 ta  elementar  soha   diskret
modellari   yig indisiga   teng.   Shuning   uchun   elementar   soha   diskret   modellari	
’
tuzilib chiqiladiva yig indisi hisoblanadi.	
’ Berilgan   murakkab   sohani   qanday   elementar   sohalarga   ajratishni   hal
qilinganidan   keyin,   murakkab   sohani   yuqorida   aytib   o tilganidek   programma’
ta minotida uning ikki o lchovli visual ko rinishini chiziladi:	
’ ’ ’
Ikki   o lchovli   visual   ko tinishini   tasvirlanganidan   keyin,   murakkab   soha	
’ ’
ikki   o lchovli   chizmasini   uch   o lchovliga   o tqazish   kerak,   buning   uchun	
’ ’ ’
maxsus   3D   tugmasi   ishlatiladi,   ushbu   tugma   orqali   surish,   ko chirish   va   burish	
’ qiymatlari   kiritiladi.   Bunda   bizga   faqat   surish   kerak   bo lgani   uchun   surishga’
qiymat beriladi va murakkab soha uch o lchovliga o tqaziladi.	
’ ’
Murakkab   soha   uch   o lchovli   ko rinishini   ham   tasvirlanganidan   song   esa,	
’ ’
murakkab sohaning elementar soha diskret modellarini tuzib chiqish kerak bo ladi	
’
va quyidagi ketma   ketliklda amalga oshiriladi:	
–
Birinchi bo lib bir burchagi o yilgan to rtburchak turiga mansub elementar	
’ ’ ’
soha   diskret   modeli   tuziladi,   buning   uchun   REL   tugmasi   bosilganidan   keyin
ekrannan   turga   tegishli   bo lgan   beshta   asosiy   koordinatalarni   tanlashimiz   kerak	
’
bo ladi. Oy oqida yotuvchi tomonini to rtta bo lakka bolib chiqiladi, Ox oqida	
’ ’ ’
yotuvchi   bo lagini   to rt,   Oy   oqida   yotuvchi   tomonini   t ortta   bo laklarga	
’ ’ ’ ’
ajratuvchi   qiymatlarni   berib   OK   tugmasini   bosiladi.   Natijada   elementar   soha
diskret modelidan tuzilgan ko rinishini ekranida ko rsatiladi.	
’ ’ Ikkinchi bo lib bir burchagi o yilgan to rtburchak turiga mansub elementar’ ’ ’
soha   diskret   modeli   tuziladi.   Oy   oqida   yotuvchi   tomonini   m   -   uchta   bo lakka	
’
bolib   chiqiladi,   Ox   oqida   yotuvchi   bo lagini   uchta   (n1),   Oy   oqida   yotuvchi	
’
tomonini   t ortta   (n2)   bo laklarga   ajratuvchi   qiymatlarni   berib   OK   tugmasini	
’ ’
bosiladi.  Uchinchi   bo lib   bir   burchagi   o yilgan   to rtburchak   turiga   mansub’ ’ ’
elementar   soha   diskret   modeli   tuziladi.   Oy   oqida   yotuvchi   tomonini   uchta   (m)
bo lakka   bolib   chiqiladi,   Ox   oqida   yotuvchi   bo lagini   to rtta   (n1),   Oy   oqida	
’ ’ ’
yotuvchi   tomonini   t ortta   (n2)   bo laklarga   ajratuvchi   qiymatlarni   berib   OK	
’ ’
tugmasini bosiladi. 
T ortinchi bo lib to liq to rtburchak turiga mansub elementar soha diskret	
’ ’ ’ ’
modeli   tuziladi,   buning   uchun   RES   tugmasi   bosilganidan   keyin   ekrannan   turga
tegishli   bo lgan   to rtta   asosiy   koordinatalarni   tanlashimiz   kerak   bo ladi.   Oy	
’ ’ ’
oqida   yotuvchi   tomonini   uchta   (m)   bo lakka   bolib   chiqiladi,   Ox   oqida   yotuvchi	
’
bo lagini   sakkizta   (n)   bo laklarga   ajratuvchi   qiymatlarni   berib   OK   tugmasini	
’ ’
bosiladi.  Beshinchi   bo lib   bir   burchagi   o yilgan   to rtburchak   turiga   mansub’ ’ ’
elementar soha diskret modeli tuziladi. Oy oqida yotuvchi tomonini uchta (m), Ox
oqida   yotuvchi   bo lagini   to rtta   (n1),   Oy   oqida   yotuvchi   tomonini   t ortta   (n2)
’ ’ ’
bo laklarga ajratuvchi qiymatlarni berib OK tugmasini bosiladi. 	
’
Oltinchi   elementar   soha   beshinchi   elementar   sohaga   uxshash   va   unga
uaxshash qiymatlar beriladi va OK qiymati bosiladi. Ettinchi bo lib bir burchagi o yilgan to rtburchak turiga mansub elementar’ ’ ’
soha   diskret   modeli   tuziladi.   Oy   oqida   yotuvchi   tomonini   uchta   (m),   Ox   oqida
yotuvchi   bo lagini   to rtta   (n1),   Oy   oqida   yotuvchi   tomonini   ikkita   (n2)	
’ ’
bo laklarga ajratuvchi qiymatlarni berib OK tugmasini bosiladi.	
’ Sakkizinchi   ham   yuqridagi   tur   songari   elementar   soha.   Oy   oqida   yotuvchi
tomonini  uchta (m), Ox oqida yotuvchi bo lagini ikkita (n1), Oy oqida yotuvchi’
tomonini to rtta (n2) bo laklarga ajratuvchi qiymatlarni beriladi.	
’ ’
To qqinzinchi   bo lib   sektor   turiga   mansub   elementar   soha   diskret   modeli	
’ ’
tuziladi.   Oy   oqida   yotuvchi   tomonini   ikkita   (m),   Ox   oqida   yotuvchi   bo lagini	
’
ikkita   (n1),   Oy   oqida   yotuvchi   tomonini   ikkita   (n2)   bo laklarga   ajratuvchi	
’
qiymatlarni berib OK tugmasini bosiladi. Elementar   soha   diskret   modellarini   tuzish   mobaynida   ularning   natijalarini   MNK
tugmasidan ko rish imkoniyati mavjud.’
Barcha elementar soha diskret modellari tuzib chiqilganidan keyin esa, ushbu
soha diskret modellari yig ish ketma   ket amali bajar iladi.	
’ –
 
 
   
Yuqoridagi   amalga   oshirilgan   qo shish   ketma    ketligidan  keyin,   hosil   bo lgan’ – ’
murakkab   soha   diskret   modelini   MNK   tugmasi   orqali   ko rish   mumkin   yoki	
’
programma   ta minoti   joylashgan   katalogda   MNK.txt   va   MNZ.txt   fayllarida	
’
saqlanadi.
Quyidagi rasmda MNK tugmasi orqali natijalarning ko rinishi keltirilgan. Demak,	
’
hosil bo lgan murakkab soha tugun nuqtalar soni 756 ga teng va elementlar soni	
’
410 ga teng bo ldi.	
’ Barcha   elementar   soha   diskret   modellarini   yaratish   va   qo shish   amallari   ikki   o lchovli’ ’
ko rinishda   amalga   oshirildi.   Murakkab   sohaning   uch   o lchovli   visual   ko rinishini   ko rish	
’ ’ ’ ’
uchun GPH tugmasidan foydalanish kerak bo ladi va murakkab soha quyidagi ko rinishga ega	
’ ’
bo ladi:	
’ Ushbu visual ko rinishni hosil qilish uchun OpenGL kutubxonasidan foydalanildi.’ XULOSA
Ushbu dissertasiya ishida uch o lchovli murakkab sohaning diskret modelini tuzish’
texnologiyasi yoritib berilgan.
Chekli   elementlar   qaysi   sohada   qollanilayotganlar   bilan   tanishib   chiqdim.   Shunga
uxshash   metod   algoritmlari   bilan   tanishib,   ularning   ustun   va   kamchiliklarini   ham
o rganib chiqdim. O rganilgan metod asosida yaratilgan programma paketlarning	
’ ’
umumiy strukturasini ham o zlashtirdim.	
’
Elementar   soha   turlarini   ko rib   chiqdim   va   uning   ikki   o lchovli   diskret   modeli
’ ’
yordamida uch o lchovliga uning proeksiyalari  yordamida o tqazish usullarini va	
’ ’
algoritmlarini o rgandim.
’
Berilgan   murakkab   soha   elementar   sohalarga   ajratiladi   va   ushbu   sohalarni
qo shuvchi   algoritm   ishlab   chiqildi.   Dastur   C++   programmalash   dasturi   asosida	
’
yaratilgan bo lib, soha visual ko rinishini ko rish uchun OpenGL kutubxonasidan	
’ ’ ’
foydalanildi.
Qo yilgan   maqsadga   erishish   uchun   elementar   sohalarga   ajratish   metodi	
’
o rganib   chiqildi.   Ushbu   dissertatsiya   ishida   to rtta   elementar   soha   haqida	
’ ’
ma lumotlar   va   ularning   algoritmlari   bilan   berilib   ketilgan.   Shuningdek   men	
’
sohalarni   qo shish   algoritmini   o rgandim   va   dasturga   qo lladim.   Qisqacha	
’ ’ ’
aytganda o rganganlarim yordamida berilgan murakkab sohani elementar sohalarga	
’
ajratib uning diskret modelini tuza olaman. Adabiyotlar :
1.   Работнов   Ю.Н.   Механика   деформируемого   твердого   тела:   -   М.:
Наука, 1988. 
2.   Л.   Сегерлинд   -   Применение   метода   конечных   элементов:   -М:Мир,
1979 
3. Зенкевич О. Метод конечных элементов в технике: - М.: Мир, 1975. 
4. Сьярле Ф. Метод конечных элементов для эллиптических задач: Пер.
с англ. - М.:Мир, 1980. 
5. Норри Д. Фрl Ж. - Введение в метод конечных элементов: Мир
6.   Васидзу   К.   Вариационные   методы   в   теори   упругости   и
пластичности: Пер. с англ. - М: Мир,1987. 
7.   Стренг   Г.,   Фикс   Дж.   Теор    метода   конечных   элементов.   М.:   Мир,
1977. 349 с.
8.   Розин   Л.А.   Стержневые   системы   как   системы   конечных   элементов.
Л.: Изд-во ЛГУ, 1976. 232 с.
9.   Сэджвик   Р.   Фундаментальные   алгоритмы   на   С++.Алгоритмы   на
графах части 1-4.Diasoft.2002.(600dpi)
10.   Сэджвик   Р.   Фундаментальные   алгоритмы   на   С++.Алгоритмы   на
графах часть 5.Diasoft.2002.(600dpi)
C++ Builder в задачах и примерах. Санкт-Петербург, “БХВ Петербург” 2005 # include  < vcl . h >
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <io.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm" 
#define BLACK_INDEX     255
TForm1 *Form1;
FILE *stream;
bool switcher = true;
bool button3D = false;
bool mathModSw = true;
int xy = 0,xs,ys; 
     HGLRC ghRC;
     HDC   ghDC;  
     GLfloat latitude, longitude, latinc, longinc;
     GLdouble radius;
void liner(int);
GLvoid initializeGL(GLsizei width, GLsizei height);
__fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
{
         this->GroupBox1->Hide();
         this->GroupBox2->Hide();
         this->GroupBox3->Hide();
         this->GroupBox4->Hide();
         this->StringGrid1->Hide();
         this->StringGrid2->Hide();
         this->StringGrid3->Hide();
         this->StringGrid4->Hide();
         this->StringGrid5->Hide();
         this->StringGrid6->Hide();
         this->StringGrid7->Hide();
         this->StringGrid8->Hide();
         this->StringGrid9->Hide();
         this->StringGrid10->Hide();
         this->StringGrid11->Hide();
         this->ProgressBar1->Hide();
         this->Panel2->Hide();
         this->DoubleBuffered = true;
         Form1->Image1->Canvas->Font->Color = clWhite;
         Form1->Image1->Canvas->Font->Size = 11;
         liner(25);
}
int writeToXLS();
void polarView(GLdouble radius, GLdouble twist, GLdouble latitude,
              GLdouble longitude)
{
     glTranslated(0, -0.5, -radius);
     //glRotated(-twist, 0.0, 0.0, 1.0);
     //glRotated(-latitude, 1.0, 0.0, 0.0);
     glRotated(longitude, 0.0, 0.1, 0.0);
}
void openGL(int id1){
         int row,n,start,ended,colC5;
         float x,y,z;
         Form1->Image1->Hide();
         Form1->Panel1->Hide();
         Form1->GroupBox3->Show();
         colC5 = Form1->StringGrid5->ColCount;
         n = Form1->StringGrid6->Cells[5][id1].ToInt();
         start = Form1->StringGrid6->Cells[6][id1].ToInt();
         ended = Form1->StringGrid6->Cells[7][id1].ToInt();
         row = (ended-start)/n;
     glPushMatrix();
     latitude += latinc;
     longitude += longinc;
     polarView( radius, 0, latitude, longitude );
         glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);          for(int i = start,m;i < row+start;i++){
                 glBegin(GL_QUADS);
                 glColor3f(0,0,0);
                 for(int j = 1,t;j <= colC5;j++){
                         if(j == 3)
                                 t = j+1;
                         else{
                                 if(j == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f(x/500, y/500, z/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = 1,t;j <= colC5;j++){
                         if(j == 3)
                                 t = j+1;
                         else{
                                 if(j == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x-1)/500, (y-1)/500, (z-1)/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = 1,t;j <= colC5;j++){
                         if(j == 3)
                                 t = j+1;
                         else{
                                 if(j == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x+1)/500, (y+1)/500, (z+1)/500);
                 }
                 glEnd();
         }
         for(int i = ended-row,m;i < ended;i++){
                 glBegin(GL_QUADS);
                 glColor3f(0,0,0);
                 for(int j = colC5+1,t;j <= 2*colC5;j++){
                         if(j-colC5 == 3)
                                 t = j+1;
                         else{
                                 if(j-colC5 == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f(x/500, y/500, z/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = colC5+1,t;j <= 2*colC5;j++){
                         if(j-colC5 == 3)
                                 t = j+1;                          else{
                                 if(j-colC5 == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x-1)/500, (y-1)/500, (z-1)/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = colC5+1,t;j <= 2*colC5;j++){
                         if(j-colC5 == 3)
                                 t = j+1;
                         else{
                                 if(j-colC5 == 4)
                                         t = j-1;
                                 else
                                         t = j;
                         }
                         m = Form1->StringGrid3->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x+1)/500, (y+1)/500, (z+1)/500);
                 }
                 glEnd();
         }
         start = Form1->StringGrid6->Cells[8][id1].ToInt();
         ended = Form1->StringGrid6->Cells[9][id1].ToInt();
         for(int i = start,m;i < ended;i++){
                 glBegin(GL_QUADS);
                 glColor3f(0,0,0);
                 for(int j = 0,t;j < colC5;j++){
                         if(j == 2)
                                 t = j+1;
                         else
                                 if(j == 3)
                                         t = j-1;
                                 else
                                         t = j;
                         m = Form1->StringGrid5->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f(x/500, y/500, z/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = 0,t;j < colC5;j++){
                         if(j == 2)
                                 t = j+1;
                         else
                                 if(j == 3)
                                         t = j-1;
                                 else
                                         t = j;
                         m = Form1->StringGrid5->Cells[t][i].ToInt();
                         x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x-1)/500, (y-1)/500, (z-1)/500);
                 }
                 glEnd();
                 glBegin(GL_LINE_LOOP);
                 glColor3f(1,1,1);
                 for(int j = 0,t;j < colC5;j++){
                         if(j == 2)
                                 t = j+1;
                         else
                                 if(j == 3)
                                         t = j-1;
                                 else
                                         t = j;
                         m = Form1->StringGrid5->Cells[t][i].ToInt();                          x = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y = Form1->StringGrid4->Cells[2][m].ToDouble();
                         z = Form1->StringGrid4->Cells[5][m].ToDouble();
                         glVertex3f((x+1)/500, (y+1)/500, (z+1)/500);
                 }
                 glEnd();
         }
         glPopMatrix();
         SwapBuffers(ghDC);
}
void liner(int length){
         Form1->Image1->Canvas->Brush->Color = cl3DDkShadow;
         Form1->Image1->Canvas->Rectangle(0,0,Form1->Image1->Width,Form1->Image1->Height);
         Form1->Image1->Canvas->Pen->Style = psDot;
         Form1->Image1->Canvas->Pen->Color = clGray;
         for(int i = length,j = 1;i < Form1->Image1->Width;i = i + length,j++){
                 if(j%10 == 0)
                         Form1->Image1->Canvas->Pen->Style = psSolid;
                 else
                         Form1->Image1->Canvas->Pen->Style = psDot;
                 Form1->Image1->Canvas->MoveTo(i,0);
                 Form1->Image1->Canvas->LineTo(i,Form1->Image1->Height);
                 Form1->Image1->Canvas->MoveTo(0,i);
                 Form1->Image1->Canvas->LineTo(Form1->Image1->Width,i);
         }
         Form1->Image1->Canvas->Pen->Style = psSolid;
         Form1->Image1->Canvas->Pen->Color = clWhite;
} 
GLvoid resize( GLsizei width, GLsizei height )
{
     GLfloat aspect;
     glViewport( 0, 0, width, height );
     aspect = (GLfloat) width / height;
     glMatrixMode( GL_PROJECTION );
     glLoadIdentity();
     gluPerspective( 40.0, aspect, 3.0, 7.0 );
     glMatrixMode( GL_MODELVIEW );
}
void miniEllipses(){
         int x0,y0,tag = Form1->StringGrid1->Tag;
         Form1->Image1->Canvas->Pen->Color = clWhite;
         Form1->Image1->Canvas->Pen->Style = psSolid;
         for(int i = 0;i < tag;i++){
                 if(Form1->StringGrid1->Cells[1][i] !=""){
                         x0 = Form1->StringGrid1->Cells[1][i].ToInt();
                         y0 = Form1->StringGrid1->Cells[2][i].ToInt();
                         Form1->Image1->Canvas->Ellipse(x0-4,y0-4,x0+4,y0+4);
                 }
         }
}
int showerListItems(){
         int tx,tag = Form1->StringGrid6->RowCount;
         String s1 = " soha",s0,s;
         Form1->ListBox1->Columns = 1;
         Form1->ListBox2->Columns = 1;
         Form1->ListBox1->Clear();
         Form1->ListBox2->Clear();
         for(int i = 0;i < tag;i++){
                 tx = Form1->StringGrid6->Cells[0][i].ToInt();
                 s0 = tx;
                 s = s0 + s1;
                 Form1->ListBox1->Items->Add(s);
                 Form1->ListBox2->Items->Add(s);
         }
         return 0;
}
int rebooter(int i2){
         int row0,col0,row1,col1,row2,col2,last,id2;
         row0 = Form1->StringGrid9->RowCount;
         col0 = Form1->StringGrid9->ColCount;
         row1 = Form1->StringGrid10->RowCount;
         col1 = Form1->StringGrid10->ColCount;
         row2 = Form1->StringGrid11->RowCount;
         col2 = Form1->StringGrid11->ColCount;
         for(int i = 0;i < row1;i++){
                 for(int j = 0;j < col1;j++){
                         last = Form1->StringGrid10->Cells[j][i].ToInt();                          for(int k = 0;k < row0;k++){
                                 if(Form1->StringGrid9->Cells[col0-1][k] == ""){
                                         ShowMessage(k);
                                 }
                                 else
                                 if(last == Form1->StringGrid9->Cells[col0-1][k].ToInt())
                                         Form1->StringGrid10->Cells[j][i] = k;
                         }
                 }
         }
         for(int i = 0;i < row2;i++){
                 for(int j = 0;j < col2;j++){
                         if(Form1->StringGrid11->Cells[j][i] == "")
                                 ShowMessage(i);
                         else{
                                 last = Form1->StringGrid11->Cells[j][i].ToInt();
                                 for(int k = 0;k < row0;k++){
                                         if(last == Form1->StringGrid9->Cells[col0-1][k].ToInt())
                                                 Form1->StringGrid11->Cells[j][i] = k;
                                 }
                         }
                 }
         }
         Form1->StringGrid4->RowCount = row0;
         Form1->StringGrid4->ColCount = col0-1;
         for(int i = 0;i < row0;i++)
                 for(int j = 0;j < col0-1;j++){
                         Form1->StringGrid4->Cells[j][i] = Form1->StringGrid9->Cells[j][i];
                 }
         Form1->StringGrid3->RowCount = row1;
         Form1->StringGrid3->ColCount = col1;
         for(int i = 0;i < row1;i++)
                 for(int j = 0;j < col1;j++)
                         Form1->StringGrid3->Cells[j][i] = Form1->StringGrid10->Cells[j][i];
         Form1->StringGrid5->RowCount = row2;
         Form1->StringGrid5->ColCount = col2;
         for(int i = 0;i < row2;i++)
                 for(int j = 0;j < col2;j++)
                         Form1->StringGrid5->Cells[j][i] = Form1->StringGrid11->Cells[j][i];
         row0 = Form1->StringGrid6->RowCount;
         col0 = Form1->StringGrid6->ColCount;
         Form1->StringGrid10->Tag = 0;
         last = Form1->StringGrid10->Tag;
         Form1->StringGrid10->ColCount = col0;
         id2 = i2;
         for(int i = 0;i < row0;i++){
                 if(i != id2){
                         Form1->StringGrid10->Tag++;
                         last = Form1->StringGrid10->Tag;
                         Form1->StringGrid10->RowCount = last;
                         for(int j = 0;j < col0;j++){
                                 Form1->StringGrid10->Cells[j][last-1] = Form1->StringGrid6-
>Cells[j][i];
                         }
                 }
         }
         row0 = Form1->StringGrid10->RowCount;
         col0 = Form1->StringGrid10->ColCount;
         Form1->StringGrid6->RowCount = row0;
         Form1->StringGrid6->ColCount = col0;
         for(int i = 0;i < row0;i++)
                 for(int j = 0;j < col0;j++)
                         Form1->StringGrid6->Cells[j][i] = Form1->StringGrid10->Cells[j][i];
         Form1->StringGrid9->Tag = 0;
         Form1->StringGrid10->Tag = 0;
         Form1->StringGrid11->Tag = 0;
         Form1->StringGrid6->Tag = Form1->StringGrid6->RowCount;
         writeToXLS();
         return 0;
}
void filtr(int id1,int id2){
         int l,row5,col5,row7,row6,n,*buff1,*buff2,start,ended;
         row7 = Form1->StringGrid7->RowCount;
         col5 = 2;
         for(int u = 0,s = 0;u < 2;u++){
                 if(u == 0){
                         start = Form1->StringGrid6->Cells[8][id1].ToInt();
                         ended = Form1->StringGrid6->Cells[9][id1].ToInt();
                         l = Form1->StringGrid6->Cells[5][id1].ToInt();
                         n = ended-start;                          buff1 = new int[n];
                 }
                 else{
                         start = Form1->StringGrid6->Cells[8][id2].ToInt();
                         ended = Form1->StringGrid6->Cells[9][id2].ToInt();
                         l = Form1->StringGrid6->Cells[5][id1].ToInt();
                         n = ended-start;
                         buff2 = new int[n];
                 }
                 for(int i = start,x = 0;i < ended;i=i+l){
                         for(int j = 0,p;j < col5;j++){
                                 p = Form1->StringGrid5->Cells[j][i].ToInt();
                                 for(int k = 0,q;k < row7;k++){
                                         q = Form1->StringGrid7->Cells[0][k].ToInt();
                                         if(p == q){
                                                 s++;
                                                 break;
                                         }
                                 }
                         }
                         if(s >= 2){
                                 //ShowMessage(i);
                                 i = i;
                         }
                         else{
                                 if(u == 0){
                                         for(int k = i;k < i+l;k++){
                                                 buff1[x] = k;
                                                 x++;
                                         }
                                 }
                                 else{
                                         for(int k = i;k < i+l;k++){
                                                 buff2[x] = k;
                                                 x++;
                                         }
                                 }
                         }
                         s = 0;
                 }
         }
         row6 = Form1->StringGrid6->RowCount;
         for(int i = 0,row = 0;i < row6;i++){
                 if(i!=id1&&i!=id2){
                         start = Form1->StringGrid6->Cells[8][i].ToInt();
                         ended = Form1->StringGrid6->Cells[9][i].ToInt();
                 }
                 else{
                         if(i == id1){
                                 start = Form1->StringGrid6->Cells[8][i].ToInt();
                                 ended = Form1->StringGrid6->Cells[9][i].ToInt();
                                 n = ended-start;
                                 start = 0;
                                 ended = n-l*(row7-1);
                         }
                         else{
                                 start = Form1->StringGrid6->Cells[8][i].ToInt();
                                 ended = Form1->StringGrid6->Cells[9][i].ToInt();
                                 n = ended-start;
                                 start = 0;
                                 ended = n-l*(row7-1);
                         }
                 }
                 Form1->StringGrid6->Cells[8][i] = row;
                 for(int j = start,x;j < ended;j++){
                         if(i!=id1&&i!=id2){
                                 x = j;
                         }
                         else{
                                 if(i == id1)
                                         x = buff1[j];
                                 else
                                         x = buff2[j];
                         }
                         if(Form1->StringGrid5->Cells[0][x] != ""){
                                 row++;
                                 Form1->StringGrid11->RowCount = row;
                                 for(int k = 0;k < col5;k++){
                                         Form1->StringGrid11->Cells[k][row-1] = Form1-
>StringGrid5->Cells[k][x];                                  }
                         }
                         else
                                 ShowMessage(x);
                 }
                 Form1->StringGrid6->Cells[9][i] = row;
         }
         row7 = Form1->StringGrid11->RowCount;
         Form1->StringGrid5->RowCount = row7;
         for(int i = 0;i < row7;i++)
                 for(int j = 0;j < col5;j++)
                         Form1->StringGrid5->Cells[j][i] = Form1->StringGrid11->Cells[j][i];
}
int replacer(int i1,int i2){
         int row7,s0,e0,s1,e1,col0,col1,n1,n2,l,id0,id1,f,s;
         int start,ended;
         row7 = Form1->StringGrid7->RowCount;
         id0 = i1;
         id1 = i2;
         start = Form1->StringGrid6->Cells[1][id1].ToInt();
         ended = Form1->StringGrid6->Cells[2][id1].ToInt();
         l = Form1->StringGrid6->Cells[5][id1].ToInt();
         s = (ended-start)/(l+1);
         start = Form1->StringGrid6->Cells[1][id0].ToInt();
         ended = Form1->StringGrid6->Cells[2][id0].ToInt();
         f = (ended-start)/(l+1);
         s0 = Form1->StringGrid6->Cells[6][id1].ToInt();
         e0 = Form1->StringGrid6->Cells[7][id1].ToInt();
         s1 = Form1->StringGrid6->Cells[8][id1].ToInt();
         e1 = Form1->StringGrid6->Cells[9][id1].ToInt();
         col0 = Form1->StringGrid3->ColCount;
         col1 = Form1->StringGrid5->ColCount;
         for(int i = 0;i < row7;i++){
                 n2 = Form1->StringGrid7->Cells[1][i].ToInt();
                 for(int j = s0;j < e0;j++){
                         for(int k = 1;k < col0;k++){
                                 n1 = Form1->StringGrid3->Cells[k][j].ToInt();
                                 for(int p = 0;p <= l;p++){
                                         if(n1 == s*p+n2){
                                                 Form1->StringGrid3->Cells[k][j] = f*p + Form1-
>StringGrid7->Cells[0][i].ToInt();
                                         }
                                 }
                         }
                 }
                 for(int j = s1;j < e1;j++){
                         for(int k = 0;k < col1;k++){
                                 n1 = Form1->StringGrid5->Cells[k][j].ToInt();
                                 for(int p = 0;p <= l;p++){
                                         if(n1 == s*p+n2){
                                                 Form1->StringGrid5->Cells[k][j] = f*p + Form1-
>StringGrid7->Cells[0][i].ToInt();
                                         }
                                 }
                         }
                 }
         }
         //filtr(i1,i2);
         return 0;
}
void comparer(int id1,int id2){
         int row7,n1,n2,start1,ended1,start2,ended2,l;
         float x1,x2,y1,y2,x3,y3,x4,y4;
         l = Form1->StringGrid6->Cells[5][id1].ToInt();
         start1 = Form1->StringGrid6->Cells[1][id1].ToInt();
         ended1 = Form1->StringGrid6->Cells[2][id1].ToInt();
         start2 = Form1->StringGrid6->Cells[1][id2].ToInt();
         ended2 = Form1->StringGrid6->Cells[2][id2].ToInt();
         n1 = (ended1-start1)/(l+1);
         n2 = (ended2-start2)/(l+1);
         Form1->StringGrid7->ColCount = 2;
         for(int i = start1,s = 0;i < start1+n1;i++){
                 x1 = Form1->StringGrid4->Cells[1][i].ToDouble();
                 y1 = Form1->StringGrid4->Cells[2][i].ToDouble();
                 x2 = Form1->StringGrid4->Cells[3][i].ToDouble();
                 y2 = Form1->StringGrid4->Cells[4][i].ToDouble();
                 x3 = x1 + x2;
                 y3 = y1 + y2;
                 for(int j = start2;j < start2+n2;j++){                          x1 = Form1->StringGrid4->Cells[1][j].ToDouble();
                         y1 = Form1->StringGrid4->Cells[2][j].ToDouble();
                         x2 = Form1->StringGrid4->Cells[3][j].ToDouble();
                         y2 = Form1->StringGrid4->Cells[4][j].ToDouble();
                         x4 = x1 + x2;
                         y4 = y1 + y2;
                         if(x3>=(x4-2)&&x3<=(x4+2)&&y3>=(y4-2)&&y3<=(y4+2)){
                                 s++;
                                 Form1->StringGrid7->RowCount = s;
                                 Form1->StringGrid7->Cells[0][s-1] = i;
                                 Form1->StringGrid7->Cells[1][s-1] = j;
                                 break;
                         }
                 }
         }
         row7 = Form1->StringGrid7->RowCount;
         Form1->Label19->Caption = row7*(l+1);
}
int hangerArea(int id1,int id2){
         int *N2,n,m,l,s,start,ended,id,row,col,tag;
         int n1,n2,s_id,e_id,row7,N0,s0,s1,**buffer;
         id = id2;
         l = Form1->StringGrid6->Cells[5][id].ToInt();
         start = Form1->StringGrid6->Cells[1][id1].ToInt();
         ended = Form1->StringGrid6->Cells[2][id1].ToInt();
         N0 = ended - start;
         start = Form1->StringGrid6->Cells[1][id].ToInt();
         ended = Form1->StringGrid6->Cells[2][id].ToInt();
         n = ended - start;
         s = n/(l+1);
         row7 = Form1->StringGrid7->RowCount;
         N2 = new int[n-row7*(l+1)];
         buffer = new int*[row7*(l+1)];
         for(int i = 0,k = 0;i <= l;i++)
                 for(int j = 0,q;j < row7;j++){
                         buffer[k] = new int[2];
                         q = Form1->StringGrid7->Cells[0][j].ToInt();
                         buffer[k][0] = Form1->StringGrid4->Cells[0][i*N0/(l+1)+q].ToInt();
                         q = Form1->StringGrid7->Cells[1][j].ToInt();
                         buffer[k][1] = Form1->StringGrid4->Cells[0][i*s+q].ToInt();
                         k++;
                 }
         for(int i = start,k,t = 0,breaker = 0,q;i < ended;i++){
                 k = Form1->StringGrid4->Cells[0][i].ToInt();
                 for(int p = 0;p < row7*(l+1);p++){
                         if(k == buffer[p][1]){
                                 breaker++;
                                 q = buffer[p][0];
                                 break;
                         }
                         else
                                 if(k > buffer[p][1])
                                         t++;
                 }
                 if(breaker == 0)
                         Form1->StringGrid4->Cells[0][i] = N0+k-t;
                 else
                         Form1->StringGrid4->Cells[0][i] = q;
                 breaker = 0;
                 t = 0;
         }
         for(int i = 0,y = 0,k = 0;i < n;i++){
                 for(int j = 0,t,x = 0;j < row7;j++){
                         t = Form1->StringGrid7->Cells[1][j].ToInt();
                         if((i+start-t)%s == 0){
                                 x++;
                                 y = x;
                                 break;
                         }
                         else
                                 y = 0;
                 }
                 if(y == 0){
                         N2[k] = i+start;
                         k++;
                 }
         }
         row = Form1->StringGrid6->RowCount;
         replacer(id1,id2);
         for(int i = 0,parts;i < row;i++){                          /* stringGrid4->stringGrid9 */
                 if(i!=id){
                         col = Form1->StringGrid4->ColCount;
                         Form1->StringGrid9->ColCount = col+1;
                         if(i == id1){
                                 m = 2;
                         }
                         else{
                                 m = 1;
                         }
                         s_id = Form1->StringGrid9->Tag;
                         for(int j = 0;j <= l;j++){
                                 for(int k = 0;k < m;k++){
                                         if(k != 0){
                                                 start = Form1->StringGrid6->Cells[1][id].ToInt();
                                                 ended = Form1->StringGrid6->Cells[2][id].ToInt();
                                                 s1 = ended-start-row7*(l+1);
                                                 parts = s1/(l+1);
                                         }
                                         else{
                                                 start = Form1->StringGrid6->Cells[1][i].ToInt();
                                                 ended = Form1->StringGrid6->Cells[2][i].ToInt();
                                                 parts = (ended-start)/(l+1);
                                         }
                                         for(int p = j*parts+start,x;p < (j+1)*parts+start;p++){
                                                 Form1->StringGrid9->Tag++;
                                                 tag = Form1->StringGrid9->Tag;
                                                 Form1->StringGrid9->RowCount = tag;
                                                 if(k != 0)
                                                         x = N2[p-start];
                                                 else
                                                         x = p;
                                                 //ShowMessage(Form1->StringGrid4->Cells[0][x]);
                                                 for(int q = 0;q < col;q++){
                                                         Form1->StringGrid9->Cells[q][tag-1] = 
Form1->StringGrid4->Cells[q][x];
                                                         if(q == col-1)
                                                                 Form1->StringGrid9->Cells[q+1]
[tag-1] = x;
                                                 }
                                         }
                                 }
                         }
                         e_id = Form1->StringGrid9->Tag;
                         Form1->StringGrid6->Cells[1][i] = s_id;
                         Form1->StringGrid6->Cells[2][i] = e_id;
                         /* stringGrid3->stringGrid10 */
                         col = Form1->StringGrid3->ColCount;
                         Form1->StringGrid10->ColCount = col;
                         if(i == id1){
                                 m = 2;
                         }
                         else{
                                 m = 1;
                         }
                         s_id = Form1->StringGrid10->Tag;
                         for(int j = 0;j < l;j++){
                                 for(int k = 0;k < m;k++){
                                         if(k != 0){
                                                 start = Form1->StringGrid6->Cells[6][id].ToInt();
                                                 ended = Form1->StringGrid6->Cells[7][id].ToInt();
                                         }
                                         else{
                                                 start = Form1->StringGrid6->Cells[6][i].ToInt();
                                                 ended = Form1->StringGrid6->Cells[7][i].ToInt();
                                         }
                                         parts = (ended-start)/l;
                                         for(int p = j*parts+start;p < (j+1)*parts+start;p++){
                                                 Form1->StringGrid10->Tag++;
                                                 tag = Form1->StringGrid10->Tag;
                                                 Form1->StringGrid10->RowCount = tag;
                                                 for(int q = 0;q < col;q++){
                                                         Form1->StringGrid10->Cells[q][tag-1] = 
Form1->StringGrid3->Cells[q][p];
                                                 }
                                         }
                                 }
                         }
                         e_id = Form1->StringGrid10->Tag;
                         Form1->StringGrid6->Cells[6][i] = s_id;                          Form1->StringGrid6->Cells[7][i] = e_id;
                         start = Form1->StringGrid6->Cells[8][i].ToInt();
                         ended = Form1->StringGrid6->Cells[9][i].ToInt();
                         if(i == id1){
                                 n1 = Form1->StringGrid6->Cells[8][id].ToInt();
                                 n2 = Form1->StringGrid6->Cells[9][id].ToInt();
                                 n = n2-n1;
                         }
                         else{
                                 n = 0;
                         }
                         s_id = Form1->StringGrid11->Tag;
                         col = Form1->StringGrid5->ColCount;
                         Form1->StringGrid11->ColCount = col;
                         for(int j = start,p;j < ended+n;j++){
                                 Form1->StringGrid11->Tag++;
                                 tag = Form1->StringGrid11->Tag;
                                 Form1->StringGrid11->RowCount = tag;
                                 if(j < ended)
                                         p = j;
                                 else{
                                         p = n1;
                                         n1++;
                                 }
                                 //if(Form1->StringGrid5->Cells[0][p] == "")
                                   //      ShowMessage(p);
                                 for(int k = 0;k < col;k++){
                                         Form1->StringGrid11->Cells[k][tag-1] = Form1-
>StringGrid5->Cells[k][p];
                                 }
                         }
                         e_id = Form1->StringGrid11->Tag;
                         Form1->StringGrid6->Cells[8][i] = s_id;
                         Form1->StringGrid6->Cells[9][i] = e_id;
                 }
         }
         rebooter(id2);
         delete N2;
         return 0;
}
void quarterEllipse(int type,int x1,int y1,int x2,int y2){
         if(type == 0){
                 Form1->Image1->Canvas->MoveTo(x1,y1);
                 Form1->Image1->Canvas->LineTo(x2,y2);
         }
         else{
                 if(type!=3){
                 float xy[4][2];
                 if(type == 1){
                         if(x1<x2&&y1>y2){
                                 xy[0][0] = 2*x1-x2;
                                 xy[0][1] = y1;
                                 xy[1][0] = x2;
                                 xy[1][1] = 2*y2-y1;
                                 xy[2][0] = x1;
                                 xy[2][1] = y1;
                                 xy[3][0] = x2;
                                 xy[3][1] = y2;
                         }
                         else{
                                 if(x1>x2&&y1<y2){
                                         xy[0][0] = 2*x2-x1;
                                         xy[0][1] = y2;
                                         xy[1][0] = x1;
                                         xy[1][1] = 2*y1-y2;
                                         xy[2][0] = x2;
                                         xy[2][1] = y2;
                                         xy[3][0] = x1;
                                         xy[3][1] = y1;
                                 }
                                 else{
                                         if(x1>x2&&y1>y2){
                                                 xy[0][0] = 2*x1-x2;
                                                 xy[0][1] = y1;
                                                 xy[1][0] = x2;
                                                 xy[1][1] = 2*y2-y1;
                                                 xy[2][0] = x2;
                                                 xy[2][1] = y2;
                                                 xy[3][0] = x1;
                                                 xy[3][1] = y1;                                          }
                                         else{
                                                 xy[0][0] = 2*x2-x1;
                                                 xy[0][1] = y2;
                                                 xy[1][0] = x1;
                                                 xy[1][1] = 2*y1-y2;
                                                 xy[2][0] = x1;
                                                 xy[2][1] = y1;
                                                 xy[3][0] = x2;
                                                 xy[3][1] = y2;
                                         }
                                 }
                         }
                 }
                 else{
                         if(x1<x2&&y1>y2){
                                 xy[0][0] = 2*x2-x1;
                                 xy[0][1] = y2;
                                 xy[1][0] = x1;
                                 xy[1][1] = 2*y1-y2;
                                 xy[2][0] = x2;
                                 xy[2][1] = y2;
                                 xy[3][0] = x1;
                                 xy[3][1] = y1;
                         }
                         else{
                                 if(x1>x2&&y1<y2){
                                         xy[0][0] = 2*x1-x2;
                                         xy[0][1] = y1;
                                         xy[1][0] = x2;
                                         xy[1][1] = 2*y2-y1;
                                         xy[2][0] = x1;
                                         xy[2][1] = y1;
                                         xy[3][0] = x2;
                                         xy[3][1] = y2;
                                 }
                                 else{
                                         if(x1>x2&&y1>y2){
                                                 xy[0][0] = 2*x2-x1;
                                                 xy[0][1] = y2;
                                                 xy[1][0] = x1;
                                                 xy[1][1] = 2*y1-y2;
                                                 xy[2][0] = x1;
                                                 xy[2][1] = y1;
                                                 xy[3][0] = x2;
                                                 xy[3][1] = y2;
                                         }
                                         else{
                                                 xy[0][0] = 2*x1-x2;
                                                 xy[0][1] = y1;
                                                 xy[1][0] = x2;
                                                 xy[1][1] = 2*y2-y1;
                                                 xy[2][0] = x2;
                                                 xy[2][1] = y2;
                                                 xy[3][0] = x1;
                                                 xy[3][1] = y1;
                                         }
                                 }
                         }
                 }
                 Form1->Image1->Canvas->Arc(xy[0][0],xy[0][1],xy[1][0],xy[1][1],xy[2][0],xy[2]
[1],xy[3][0],xy[3][1]);
                 Form1->Image1->Canvas->MoveTo(x2,y2);
         }
         }
}
void draughter(int zetX,int zetY){
         int xy0,x1,y1,x2,y2,tag,first = 0,secnd,buffer;
         tag = Form1->StringGrid1->Tag;
         for(int i = 1;i < tag;i++){
                 if(i == 1){
                         buffer = i-1;
                 }
                 if(Form1->StringGrid1->Cells[1][i] == ""){
                         first = i-1;
                         secnd = buffer;
                         if(i+1 < tag)
                                 buffer = i+1;
                 }
                 else{                          if(i<tag&&Form1->StringGrid1->Cells[1][i-1]!=""){
                                 first = i-1;
                                 secnd = i;
                         }
                         else
                                 continue;
                 }
                 xy0 = Form1->StringGrid1->Cells[0][first].ToInt();
                 x1 = Form1->StringGrid1->Cells[1][first].ToInt();
                 y1 = Form1->StringGrid1->Cells[2][first].ToInt();
                 x2 = Form1->StringGrid1->Cells[1][secnd].ToInt();
                 y2 = Form1->StringGrid1->Cells[2][secnd].ToInt();
                 x1 = x1 + zetX;
                 y1 = y1 + zetY;
                 x2 = x2 + zetX;
                 y2 = y2 + zetY;
                 quarterEllipse(xy0,x1,y1,x2,y2);
         }
}
void draughter3D(int x1,int y1,int x2,int y2){
         int x0,y0; 
         draughter(0,0);
         Form1->Image1->Canvas->Pen->Style = psDash;
         for(int i = 0;i < Form1->StringGrid1->RowCount;i++){
                 if(Form1->StringGrid1->Cells[1][i] != ""){
                         x0 = Form1->StringGrid1->Cells[1][i].ToInt();
                         y0 = Form1->StringGrid1->Cells[2][i].ToInt();
                         Form1->Image1->Canvas->MoveTo(x0,y0);
                         Form1->Image1->Canvas->LineTo(x0 + x2 - x1,y0 + y2 - y1);
                 }
         }
         draughter(x2-x1,y2-y1);
         Form1->Image1->Canvas->Pen->Style = psSolid;
}
int writeToXLS(){
         int col,row;
         float x1,x2,y1,y2,z;
         row = Form1->StringGrid4->RowCount;
         stream = fopen("MKZ.txt","w+t");
         for(int i = 0,n = 0;i < row;i++){
                 n = Form1->StringGrid4->Cells[0][i].ToInt();
                 fprintf(stream,"%i\t",n);
                 x1 = Form1->StringGrid4->Cells[1][i].ToDouble();
                 y1 = Form1->StringGrid4->Cells[2][i].ToDouble();
                 x2 = Form1->StringGrid4->Cells[3][i].ToDouble();
                 y2 = Form1->StringGrid4->Cells[4][i].ToDouble();
                 z = Form1->StringGrid4->Cells[5][i].ToDouble();
                 x1 = x1 + x2;
                 y1 = y1 + y2;
                 fprintf(stream,"%.3f\t",x1);
                 fprintf(stream,"%.3f\t",y1);
                 fprintf(stream,"%.3f\t",z);
                 fprintf(stream,"\n");
         }
         fclose(stream);
         col = Form1->StringGrid3->ColCount;
         row = Form1->StringGrid3->RowCount;
         stream = fopen("MNZ.txt","w+t");
                 for(int i = 0;i < row;i++){
                         for(int j = 1,m,w;j < col;j++){
                                 m = Form1->StringGrid3->Cells[j][i].ToInt();
                                 w = Form1->StringGrid4->Cells[0][m].ToInt();
                                 fprintf(stream,"%i\t",w);
                         }
                         fprintf(stream,"\n");
                 }
         fclose(stream);
    return 0;
}
int createrPolygon(int id){
         int start,ended,tag = Form1->StringGrid6->RowCount;
         int s,e,r,t,l,p;
         Form1->StringGrid3->ColCount = 9;
         Form1->StringGrid6->ColCount = 10;
         for(int i = 0,k,m;i < tag;i++){
                 r = 0;
                 if(id == Form1->StringGrid6->Cells[0][i].ToInt()){
                         start = Form1->StringGrid6->Cells[1][i].ToInt();
                         ended = Form1->StringGrid6->Cells[2][i].ToInt();
                         m = Form1->StringGrid6->Cells[3][i].ToInt();                          r = Form1->StringGrid6->Cells[4][i].ToInt();
                         l = Form1->StringGrid6->Cells[5][i].ToInt();
                         p = m*r;
                         Form1->StringGrid6->Cells[6][i] = Form1->StringGrid3->Tag;
                         s = (m+1)*(r+1);
                         for(int j = start,n = 0,q = 0,x = 0;j < ended-s;j++){
                                 if(n != m){
                                         if(x != p){
                                                 n++;
                                                 x++;
                                                 Form1->StringGrid3->Tag++;
                                                 k = Form1->StringGrid3->Tag;
                                                 Form1->StringGrid3->RowCount = k;
                                                 q = j;
                                                 Form1->StringGrid3->Cells[0][k-1] = k;
                                                 Form1->StringGrid3->Cells[1][k-1] = q;
                                                 Form1->StringGrid3->Cells[2][k-1] = q+1;
                                                 Form1->StringGrid3->Cells[3][k-1] = q+m+1;
                                                 Form1->StringGrid3->Cells[4][k-1] = q+m+2;
                                                 Form1->StringGrid3->Cells[5][k-1] = q+s;
                                                 Form1->StringGrid3->Cells[6][k-1] = q+1+s;
                                                 Form1->StringGrid3->Cells[7][k-1] = q+m+1+s;
                                                 Form1->StringGrid3->Cells[8][k-1] = q+m+2+s;
                                         }
                                         else{
                                                 if(j+m+1<ended){
                                                         j = j+m;
                                                         x = 0;
                                                 }
                                                 else
                                                         break;
                                         }
                                 }
                                 else{
                                         n = 0;
                                 }
                         }
                         Form1->StringGrid6->Cells[7][i] = Form1->StringGrid3->Tag;
                         s = start;
                         ended = start + (m+1)*(r+1);
                         e = ended;
                         Form1->StringGrid5->ColCount = 4;
                         t = 1;
                         Form1->StringGrid6->Cells[8][i] = Form1->StringGrid5->Tag;
                         for(int j = s+1;s<e?j<e:j>=e;j=j+t){
                                 for(int p = 0;p < l;p++){
                                         Form1->StringGrid5->Tag++;
                                         k = Form1->StringGrid5->Tag;
                                         Form1->StringGrid5->RowCount = k;
                                         Form1->StringGrid5->Cells[0][k-1] = j-t+p*(m+1)*(r+1);
                                         Form1->StringGrid5->Cells[1][k-1] = j+p*(m+1)*(r+1);
                                         Form1->StringGrid5->Cells[2][k-1] = j-t+
(p+1)*(m+1)*(r+1);
                                         Form1->StringGrid5->Cells[3][k-1] = j+(p+1)*(m+1)*(r+1);
                                 }
                                 if(j-s == m)
                                         t = m+1;
                                 else{
                                         if(j == ended-1){
                                                 t = -1;
                                                 e = e+s;
                                                 s = e-s;
                                                 e = e-s;
                                         }
                                         else{
                                                 if(ended-j == m+1)
                                                         t = -m-1;
                                         }
                                 }
                         }
                         Form1->StringGrid6->Cells[9][i] = Form1->StringGrid5->Tag;
                 }
         }
         return 0;
}
int oPolDr(int id){
         int n,start,ended,row,col;
         float x0,y0,x1,x2,y1,y2;
         TPoint points[4];
         n = Form1->StringGrid6->Cells[5][id].ToInt();          start = Form1->StringGrid6->Cells[6][id].ToInt();
         ended = Form1->StringGrid6->Cells[7][id].ToInt();
         row = (ended-start)/n+start;
         col = 4;
         for(int i = start;i < row;i++){
                 for(int j = 1,k;j <= col;j++){
                         k = Form1->StringGrid3->Cells[j][i].ToInt();
                         x1 = Form1->StringGrid4->Cells[1][k].ToDouble();
                         y1 = Form1->StringGrid4->Cells[2][k].ToDouble();
                         x2 = Form1->StringGrid4->Cells[3][k].ToDouble();
                         y2 = Form1->StringGrid4->Cells[4][k].ToDouble();
                         x0 = x1+x2;
                         y0 = y1+y2;
                         if(j == 3)
                                 n = 3;
                         else{
                                 if(j == 4)
                                         n = 2;
                                 else
                                         n = j-1;
                         }
                         points[n] = Point(x0,y0);
                 }
                 Form1->Image1->Canvas->Polygon(points,3);
         }                /*
         for(int i = start;i < row;i++){
                 for(int j = 1,k,yx;j <= col;j++){
                         k = Form1->StringGrid3->Cells[j][i].ToInt();
                         yx = Form1->StringGrid4->Cells[0][k].ToInt();
                         x1 = Form1->StringGrid4->Cells[1][k].ToDouble();
                         y1 = Form1->StringGrid4->Cells[2][k].ToDouble();
                         x2 = Form1->StringGrid4->Cells[3][k].ToDouble();
                         y2 = Form1->StringGrid4->Cells[4][k].ToDouble();
                         x0 = x1+x2;
                         y0 = y1+y2;
                         if(j == 3)
                                 n = 3;
                         else{
                                 if(j == 4)
                                         n = 2;
                                 else
                                         n = j-1;
                         }
                         Form1->Image1->Canvas->TextOutA(x0-2,y0-4,yx);
                 }
         }              */
         return 0;
}
int aPolDr(){
         int row;
         row = Form1->StringGrid6->RowCount;
         for(int i = 0;i < row;i++)
                 oPolDr(i);
         return 0;
}
int polygonDraughter(int id){
         TPoint points[4];
         int row,col,m,n,start,ended;
         float x0,y0,x1,y1,x2,y2;
         col = Form1->StringGrid5->ColCount;
         start = Form1->StringGrid6->Cells[8][id].ToInt();
         ended = Form1->StringGrid6->Cells[9][id].ToInt();
         for(int i = start;i < ended;i++){
                 for(int j = 0;j < col;j++){
                         m = Form1->StringGrid5->Cells[j][i].ToInt();
                         x1 = Form1->StringGrid4->Cells[1][m].ToDouble();
                         y1 = Form1->StringGrid4->Cells[2][m].ToDouble();
                         x2 = Form1->StringGrid4->Cells[3][m].ToDouble();
                         y2 = Form1->StringGrid4->Cells[4][m].ToDouble();
                         x0 = x1+x2;
                         y0 = y1+y2;
                         if(j == 2)
                                 n = 3;
                         else{
                                 if(j == 3)
                                         n = 2;
                                 else
                                         n = j;                          }
                         points[n] = Point(x0,y0);
                 }
                 Form1->Image1->Canvas->Polygon(points,3);
         }
         return 0;
}
float *turXY0(int fst,int scd){
         int f,s,lx,tur = 4;
         float x0,y0,x1,x2,y1,y2,*txy;
         f = fst;
         s = scd;
         lx = Form1->StringGrid1->Cells[0][f].ToInt();
         x1 = Form1->StringGrid1->Cells[1][f].ToDouble();
         y1 = Form1->StringGrid1->Cells[2][f].ToDouble();
         x2 = Form1->StringGrid1->Cells[1][s].ToDouble();
         y2 = Form1->StringGrid1->Cells[2][s].ToDouble();
         if(x2>x1&&y2<y1||x2<x1&&y2>y1)
                 if(lx == 1)
                         tur = 4;
                 else
                         tur = 2;
         else
                 if(x2>x1&&y2>y1||x2<x1&&y2<y1)
                         if(lx == 1)
                                 tur = 3;
                         else
                                 tur = 1;
         if(x1<x2&&y1<y2||x1>x2&&y1<y2)
                 if(lx == 1){
                         x0 = x2;
                         y0 = y1;
                 }
                 else{
                         x0 = x1;
                         y0 = y2;
                 }
         else
                 if(x1>x2&&y1>y2||x1<x2&&y1>y2)
                         if(lx == 1){
                                 x0 = x1;
                                 y0 = y2;
                         }
                         else{
                                 x0 = x2;
                                 y0 = y1;
                         }
         txy = new float[3];
         txy[0] = tur;
         txy[1] = x0;
         txy[2] = y0;
         return txy;
}
int restangleMathMod(int z){
         int m,n,k,l,t,x1,x2,y1,y2,M,N,pX,pY,tur = 4;
         float length,lx,ly,alpha,x0,y0,**MK,**MN1,**MN2,xy[4][2];
         m = Form1->Edit9->Text.ToInt();
         n = Form1->Edit10->Text.ToInt();
         l = Form1->Edit7->Text.ToInt();
         M = m*n;
         N = (m+1)*(n+1);
         MK = new float*[N];
         if(z == 0)
                 for(int i = 0;i < 4;i++){
                         x1 = Form1->StringGrid2->Cells[0][i].ToInt();
                         xy[i][0] = Form1->StringGrid1->Cells[1][x1].ToDouble();
                         xy[i][1] = Form1->StringGrid1->Cells[2][x1].ToDouble();
                 }
         else{
                 for(int i = 0;i < 4;i++){
                         xy[i][0] = Form1->StringGrid2->Cells[0][i].ToDouble();
                         xy[i][1] = Form1->StringGrid2->Cells[1][i].ToDouble();
                 }
         }
         MN1 = new float*[n+1];
         MN2 = new float*[n+1];
         for(int i = 0;i <= n;i++){
                 MN1[i] = new float[2];
                 MN2[i] = new float[2];
                 MN1[i][0] = xy[0][0] + i*(xy[3][0] - xy[0][0])/n;                  MN1[i][1] = xy[0][1] + i*(xy[3][1] - xy[0][1])/n;
                 MN2[i][0] = xy[1][0] + i*(xy[2][0] - xy[1][0])/n;
                 MN2[i][1] = xy[1][1] + i*(xy[2][1] - xy[1][1])/n;
                 for(int j = 0;j <= m;j++){
                         MK[i*(m+1) + j] = new float[2];
                         MK[i*(m+1) + j][0] = MN1[i][0] + j*(MN2[i][0] - MN1[i][0])/m;
                         MK[i*(m+1) + j][1] = MN1[i][1] + j*(MN2[i][1] - MN1[i][1])/m;
                 }
         }
         tur = z;
         if(z != 0){
                 x0 = Form1->StringGrid2->Cells[0][3].ToDouble();
                 y0 = Form1->StringGrid2->Cells[1][3].ToDouble();
                 for(int i = 0;i < N;i++){
                         if(tur == 1||tur == 2)
                                 MK[i][1] = 2*y0 - MK[i][1];
                         if(tur == 2||tur == 3)
                                 MK[i][0] = 2*x0 - MK[i][0];
                 }
         }  
         Form1->StringGrid6->Tag++;
         M = Form1->StringGrid6->Tag;
         Form1->StringGrid6->ColCount = 5;
         Form1->StringGrid6->RowCount = M;
         Form1->StringGrid6->Cells[0][M-1] = M;
         Form1->StringGrid6->Cells[1][M-1] = Form1->StringGrid4->Tag;
         Form1->StringGrid6->Cells[3][M-1] = m;
         Form1->StringGrid6->Cells[4][M-1] = n;
         Form1->StringGrid6->Cells[5][M-1] = l;
         Form1->StringGrid4->ColCount = 6;
         x2 = 0;
         pX = Form1->Edit3->Text.ToInt();
         pY = Form1->Edit4->Text.ToInt();
         x0 = Form1->Edit8->Text.ToDouble();
         y0 = Form1->Edit6->Text.ToDouble();
         alpha = Form1->Edit5->Text.ToDouble();
         ly = Form1->Edit2->Text.ToDouble();
         for(int p = 0;p <= l;p++){
                 for(int i = 0,j;i < N;i++){
                         if(alpha != 0)
                                 lx = sqrt((MK[i][0]+pX-x0)*(MK[i][0]+pX-x0)+(MK[i][1]+pY-
y0)*(MK[i][1]+pY-y0))*cos(alpha)/sin(alpha);
                         else
                                 lx = 0;
                         length = ly + abs(lx);
                         x2++;
                         Form1->StringGrid4->Tag++;
                         j = Form1->StringGrid4->Tag;
                         Form1->StringGrid4->RowCount = j;
                         Form1->StringGrid4->Cells[0][j-1] = x2;
                         Form1->StringGrid4->Cells[1][j-1] = MK[i][0] + p*pX/l;
                         Form1->StringGrid4->Cells[2][j-1] = MK[i][1] + p*pY/l;
                         Form1->StringGrid4->Cells[3][j-1] = p*pX/l;
                         Form1->StringGrid4->Cells[4][j-1] = p*pY/l;
                         Form1->StringGrid4->Cells[5][j-1] = p*length/l;
                 }
         }
         Form1->StringGrid6->Cells[2][M-1] = Form1->StringGrid4->Tag;
         createrPolygon(M);
         polygonDraughter(M-1);
         writeToXLS();
         for(int i = 0;i <= n;i++){
                 delete MN1[i];
                 delete MN2[i];
         }
         delete MN1;
         delete MN2;
         for(int i = 0;i < N;i++){
                 delete MK[i];
         }
         delete MK;
         return 0;
}
int restangleEllipseMathMod(){
         int elmk,tugk,i,j,k,m,n,n1,n2,pX,pY,l,tur = 4;
         float 
length,lx,ly,alpha,alfa,kA,kB,a,b,r,x0,y0,x1,y1,x2,y2,x3,y3,**bkxy,**array0,**array1;
         n1 = Form1->Edit1->Text.ToInt();
         n2 = Form1->Edit9->Text.ToInt();
         m = Form1->Edit10->Text.ToInt();          l = Form1->Edit7->Text.ToInt();
         n = n1 + n2;
         elmk = (n1 + n2)*m;
         tugk = (n1 + n2 + 1)*(m + 1);
         array0 = new float*[n1+n2+1];
         array1 = new float*[n1+n2+1];
         i = Form1->StringGrid2->Cells[0][1].ToInt();
         j = Form1->StringGrid2->Cells[0][2].ToInt();
         k = Form1->StringGrid2->Cells[0][3].ToInt();
         x1 = Form1->StringGrid1->Cells[1][i].ToInt();
         y1 = Form1->StringGrid1->Cells[2][i].ToInt();
         x2 = Form1->StringGrid1->Cells[1][j].ToInt();
         y2 = Form1->StringGrid1->Cells[2][j].ToInt();
         x0 = Form1->StringGrid1->Cells[1][k].ToInt();
         y0 = Form1->StringGrid1->Cells[2][k].ToInt();
         kB = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
         kA = sqrt((x0-x2)*(x0-x2) + (y0-y2)*(y0-y2));
         i = Form1->StringGrid2->Cells[0][0].ToInt();
         j = Form1->StringGrid2->Cells[0][4].ToInt();
         x1 = Form1->StringGrid1->Cells[1][i].ToInt();
         y1 = Form1->StringGrid1->Cells[2][i].ToInt();
         x2 = Form1->StringGrid1->Cells[1][j].ToInt();
         y2 = Form1->StringGrid1->Cells[2][j].ToInt();
         x0 = x2;
         y0 = y1;
         if((x1-x2)>0&&(y1-y2) < 0)
                 tur = 4;
         else{
                 if((x1-x2)<0&&(y1-y2)<0)
                         tur = 3;
                 else{
                         if((x1-x2)<0&&(y1-y2)>0)
                                 tur = 2;
                         else
                                 tur = 1;
                 }
         }
         a = abs(x1 - x2);
         b = abs(y1 - y2);
         bkxy = new float*[tugk];
         for(i = 0;i < tugk;i++)
                 bkxy[i] = new float[2];
         for(int i = 0;i <= n1+n2;i++){
                 array1[i] = new float[2];
         }
         alfa = 0;
         array1[0][0] = kA + x0;
         array1[0][1] = kA*sin(alfa)/cos(alfa) + y0;
         alfa = atan(kB/kA);
         array1[n1][0] = kA + x0;
         array1[n1][1] = kA*sin(alfa)/cos(alfa) + y0;
         alfa = atan(kB/kA) + atan(kA/kB);
         array1[n1+n2][0] = kB*cos(alfa)/sin(alfa) + x0;
         array1[n1+n2][1] = kB + y0;
         for(int i = 1,j = 1;i < n1+n2;i++){
                 if(i < n1){
                         x1 = array1[0][0];
                         y1 = array1[0][1];
                         x2 = array1[n1][0];
                         y2 = array1[n1][1];
                         n = n1;
                 }
                 else{
                         x1 = array1[n1][0];
                         y1 = array1[n1][1];
                         x2 = array1[n1+n2][0];
                         y2 = array1[n1+n2][1];
                         n = n2;
                 }
                 array1[i][0] = x1 + j*(x2-x1)/n;
                 array1[i][1] = y1 + j*(y2-y1)/n;
                 j++;
                 if(j == n)
                         j = 0;
         }
         for(i = 0,k = 0;i <= n1+n2;i++){
                 array0[i] = new float[2];
                 if(i < n1){                          alfa = i*atan(kB/kA)/n1;
                 }
                 else{
                         alfa = atan(kB/kA) + (i-n1)*atan(kA/kB)/n2;
                 }
                 if(i != n1+n2){
                         r = a*b/((cos(alfa)*sqrt(b*b + a*a*tan(alfa)*tan(alfa))));
                 }
                 else{
                         r = b;
                 }
                 array0[i][0] = r*cos(alfa) + x0;
                 array0[i][1] = r*sin(alfa) + y0;
                                  
                 x1 = array0[i][0];
                 y1 = array0[i][1];
                 x2 = array1[i][0];
                 y2 = array1[i][1];
                 for(j = 0;j <= m;j++,k++){
                         bkxy[i*(m+1)+j][0] = x1 + j*(x2-x1)/m;
                         bkxy[i*(m+1)+j][1] = y1 + j*(y2-y1)/m;
                 }
         } 
         for(i = 0;i < tugk;i++){
                 if(tur == 1||tur == 2)
                         bkxy[i][1] = 2*y0 - bkxy[i][1];
                 if(tur == 2||tur == 3)
                         bkxy[i][0] = 2*x0 - bkxy[i][0];
         }
         n = n1+n2;
         Form1->StringGrid6->Tag++;
         elmk = Form1->StringGrid6->Tag;
         Form1->StringGrid6->ColCount = 6;
         Form1->StringGrid6->RowCount = elmk;
         Form1->StringGrid6->Cells[0][elmk-1] = elmk;
         Form1->StringGrid6->Cells[1][elmk-1] = Form1->StringGrid4->Tag;
         Form1->StringGrid6->Cells[3][elmk-1] = m;
         Form1->StringGrid6->Cells[4][elmk-1] = n;
         Form1->StringGrid6->Cells[5][elmk-1] = l;
         pX = Form1->Edit3->Text.ToInt();
         pY = Form1->Edit4->Text.ToInt();
         x0 = Form1->Edit8->Text.ToDouble();
         y0 = Form1->Edit6->Text.ToDouble();
         alpha = Form1->Edit5->Text.ToDouble();
         ly = Form1->Edit2->Text.ToDouble();
         Form1->StringGrid4->ColCount = 6;
         Form1->StringGrid4->RowCount = Form1->StringGrid4->Tag;
         x2 = 0;
         for(int p = 0;p <= l;p++){
                 for(int i = 0,j;i < tugk;i++){
                         if(alpha != 0)
                                 lx = sqrt((bkxy[i][0]+pX-x0)*(bkxy[i][0]+pX-x0)+(bkxy[i][1]+pY-
y0)*(bkxy[i][1]+pY-y0))*cos(alpha)/sin(alpha);
                         else
                                 lx = 0;
                         length = ly + abs(lx);
                         x2++;
                         Form1->StringGrid4->Tag++;
                         j = Form1->StringGrid4->Tag;
                         Form1->StringGrid4->RowCount = j;
                         Form1->StringGrid4->Cells[0][j-1] = x2;
                         Form1->StringGrid4->Cells[1][j-1] = bkxy[i][0] + p*pX/l;
                         Form1->StringGrid4->Cells[2][j-1] = bkxy[i][1] + p*pY/l;
                         Form1->StringGrid4->Cells[3][j-1] = p*pX/l;
                         Form1->StringGrid4->Cells[4][j-1] = p*pY/l;
                         Form1->StringGrid4->Cells[5][j-1] = p*length/l;
                 }
         }
         Form1->Image1->Canvas->Pen->Color = clWhite;
         Form1->Image1->Canvas->Pen->Style = psSolid;
         Form1->StringGrid6->Cells[2][elmk-1] = Form1->StringGrid4->Tag;
         createrPolygon(elmk);
         polygonDraughter(elmk-1);
         for(int i = 0;i <= n;i++){
                 delete array0[i];
                 delete array1[i];
         }          
         delete array0;
         delete array1;          for(int i = 0;i < tugk;i++)
                 delete bkxy[i];
         delete bkxy;
         return 0;
}
int ellipseMathMod(){
         int i,j,k,l,n,n1,n2,m,t,elmk,tugk,pX,pY,tur = 4;
         float x0,y0,r1,r2,a,b,*ai,r,R,tx,alfa1,x1,y1,x2,y2,x3,y3,x4,y4,s1;
         float lx,ly,alpha,length,**bkxy;
         i = Form1->StringGrid2->Cells[0][0].ToInt();
         j = Form1->StringGrid2->Cells[0][1].ToInt();
         k = Form1->StringGrid2->Cells[0][2].ToInt();
         l = Form1->StringGrid2->Cells[0][3].ToInt();
         x1 = Form1->StringGrid1->Cells[1][i].ToInt();
         y1 = Form1->StringGrid1->Cells[2][i].ToInt();
         x2 = Form1->StringGrid1->Cells[1][j].ToInt();
         y2 = Form1->StringGrid1->Cells[2][j].ToInt();
         x3 = Form1->StringGrid1->Cells[1][k].ToInt();
         y3 = Form1->StringGrid1->Cells[2][k].ToInt();
         x4 = Form1->StringGrid1->Cells[1][l].ToInt();
         y4 = Form1->StringGrid1->Cells[2][l].ToInt();
         tx = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
         x0 = x4;
         y0 = y1;
         if((x1-x4)>0&&(y1-y4)<0)
                 tur = 4;
         else{
                 if((x1-x4)<0&&(y1-y4)<0)
                         tur = 3;
                 else{
                         if((x1-x4)<0&&(y1-y4)>0)
                                 tur = 2;
                         else
                                 tur = 1;
                 }
         }
         r1 = sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
         r2 = sqrt((x4-x0)*(x4-x0)+(y4-y0)*(y4-y0));
         a = sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));
         b = sqrt((x3-x0)*(x3-x0)+(y3-y0)*(y3-y0));
         n1 = Form1->Edit1->Text.ToInt();
         n2 = Form1->Edit9->Text.ToInt();
         m = Form1->Edit10->Text.ToInt();
         t = Form1->Edit7->Text.ToInt();
         n = n1 + n2;
         elmk = m*(n1 + n2);
         tugk = (m + 1)*(n1 + n2 + 1);
         bkxy = new float*[m+1];
         for(i = 0;i<=m;i++){
                 bkxy[i] = new float[2];
                 bkxy[i][0] = x1 + i*(x2-x1)/m;
                 bkxy[i][1] = y1 + i*(y2-y1)/m;
         }
         ai = new float[m];
         for(i = 0;i<m;i++){
                 ai[i] = sqrt((bkxy[i+1][0] - bkxy[i][0])*(bkxy[i+1][0] - bkxy[i][0]) + (bkxy[i+1]
[1] - bkxy[i][1])*(bkxy[i+1][1] - bkxy[i][1]));
         }
         bkxy = new float*[tugk];
         for(i = 0;i < tugk;i++)
                 bkxy[i] = new float[2];
         for(i = 0;i<=n1+n2;i++){
                 s1 = 0;
                 if(i < n1){
                         alfa1 = i*atan(b/a)/n1;
                 }
                 else{
                         alfa1 = atan(b/a)+(i-n1)*atan(a/b)/n2;
                 }
                 if(i!=n1+n2){
                         r = r1*r2/(cos(alfa1)*sqrt(r2*r2 + r1*r1*tan(alfa1)*tan(alfa1)));
                         R = a*b/(cos(alfa1)*sqrt(b*b + a*a*tan(alfa1)*tan(alfa1)));
                 }
                 else{
                         r = r2;
                         R = b;
                 }
                 for(j = 0;j <= m;j++){
                         if(j>0)
                                 s1+=ai[j-1];                          if(j == 0){
                                 bkxy[i*(m+1)+j][0] = r*cos(alfa1) + x0;
                                 bkxy[i*(m+1)+j][1] = r*sin(alfa1) + y0;
                         }
                         else{
                                 bkxy[i*(m+1)+j][0] = ((R - r)*s1/tx + r)*cos(alfa1) + x0;
                                 bkxy[i*(m+1)+j][1] = ((R - r)*s1/tx + r)*sin(alfa1) + y0;
                         }
                 }
         }
         for(i = 0;i < tugk;i++){
                 if(tur == 1||tur == 2)
                         bkxy[i][1] = 2*y0 - bkxy[i][1];
                 if(tur == 2||tur == 3)
                         bkxy[i][0] = 2*x0 - bkxy[i][0];
         }
         Form1->StringGrid6->Tag++;
         elmk = Form1->StringGrid6->Tag;
         Form1->StringGrid6->ColCount = 6;
         Form1->StringGrid6->RowCount = elmk;
         Form1->StringGrid6->Cells[0][elmk-1] = elmk;
         Form1->StringGrid6->Cells[1][elmk-1] = Form1->StringGrid4->Tag;
         Form1->StringGrid6->Cells[3][elmk-1] = m;
         Form1->StringGrid6->Cells[4][elmk-1] = n;
         Form1->StringGrid6->Cells[5][elmk-1] = t;
         pX = Form1->Edit3->Text.ToInt();
         pY = Form1->Edit4->Text.ToInt();
         x0 = Form1->Edit8->Text.ToDouble();
         y0 = Form1->Edit6->Text.ToDouble();
         alpha = Form1->Edit5->Text.ToDouble();
         ly = Form1->Edit2->Text.ToDouble();
         Form1->StringGrid4->ColCount = 6;
         Form1->StringGrid4->RowCount = Form1->StringGrid4->Tag;
         x2 = 0;
         for(int p = 0;p <= t;p++){
                 for(int i = 0,j;i < tugk;i++){
                         if(alpha != 0)
                                 lx = sqrt((bkxy[i][0]+pX-x0)*(bkxy[i][0]+pX-x0)+(bkxy[i][1]+pY-
y0)*(bkxy[i][1]+pY-y0))*cos(alpha)/sin(alpha);
                         else
                                 lx = 0;
                         length = ly + abs(lx);
                         x2++;
                         Form1->StringGrid4->Tag++;
                         j = Form1->StringGrid4->Tag;
                         Form1->StringGrid4->RowCount = j;
                         Form1->StringGrid4->Cells[0][j-1] = x2;
                         Form1->StringGrid4->Cells[1][j-1] = bkxy[i][0] + p*pX/t;
                         Form1->StringGrid4->Cells[2][j-1] = bkxy[i][1] + p*pY/t;
                         Form1->StringGrid4->Cells[3][j-1] = p*pX/t;
                         Form1->StringGrid4->Cells[4][j-1] = p*pY/t;
                         Form1->StringGrid4->Cells[5][j-1] = p*length/t;
                 }
         }
         Form1->StringGrid6->Cells[2][elmk-1] = Form1->StringGrid4->Tag;
         createrPolygon(elmk);
         polygonDraughter(elmk-1);
         for(int i = 0;i < tugk;i++)
                 delete bkxy[i];
         delete bkxy;
         return 0;
}
int sphereMathMod(){
         int f,s,n,n1,n2,m,l,elmk,tugk,pX,pY,tur = 4;
         float lx,ly,r,alpha,x0,y0,x1,x2,y1,y2,r1,r2,*txy;
         float **bkxy,**ai,**bi,**ci,length;
         n = Form1->StringGrid1->RowCount;
         f = Form1->StringGrid2->Cells[0][0].ToInt();
         s = Form1->StringGrid2->Cells[0][1].ToInt();
         if(f > s){
                 f = f + s;
                 s = f - s;
                 f = f - s;
         }
         x1 = Form1->StringGrid1->Cells[1][f].ToDouble();
         y1 = Form1->StringGrid1->Cells[2][f].ToDouble();
         x2 = Form1->StringGrid1->Cells[1][s].ToDouble();
         y2 = Form1->StringGrid1->Cells[2][s].ToDouble();
         if(f == 0&&s == n-1)
                 txy = turXY0(s,f);          else
                 txy = turXY0(f,s);
         tur = txy[0];
         x0 = txy[1];
         y0 = txy[2];
         delete txy;
         if(tur != 4){
                 x1 = x1 + x2;
                 x2 = x1 - x2;
                 x1 = x1 - x2;
                 y1 = y1 + y2;
                 y2 = y1 - y2;
                 y1 = y1 - y2;
         }
         r1 = sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
         r2 = sqrt((x2-x0)*(x2-x0)+(y2-x0)*(y2-x0));
         n1 = Form1->Edit1->Text.ToInt();
         n2 = Form1->Edit9->Text.ToInt();
         m = Form1->Edit10->Text.ToInt();
         l = Form1->Edit7->Text.ToInt();
         n = n1 + n2;
         elmk = m*n;
         tugk = (m + 1)*(n + 1);
         ai = new float*[n+1];
         bi = new float*[n+1];
         ci = new float*[n+1];
         bkxy = new float*[tugk];
         for(int i = 0;i <= n;i++){
                 ai[i] = new float[2];
                 bi[i] = new float[2];
                 ci[i] = new float[2];
         }
         for(int i = 0;i <= n;i++){
                 if(i < n1)
                         alpha = i*atan(r1/r2)/n1;
                 else
                         alpha = atan(r1/r2)+(i-n1)*atan(r2/r1)/n2;
                 if(i != n)
                         r = r1*r2/((cos(alpha)*sqrt(r1*r1 + r2*r2*tan(alpha)*tan(alpha))));
                 else
                         r = r1;
                 bi[i][0] = r*cos(alpha) + x0;
                 bi[i][1] = r*sin(alpha) + y0;
         }
         ci[0][0] = (bi[0][0]+x0)/2;
         ci[0][1] = (bi[0][1]+y0)/2;
         ci[n][0] = (bi[n][0]+x0)/2;
         ci[n][1] = (bi[n][1]+y0)/2;
         ci[n1][0] = ci[0][0];
         ci[n1][1] = ci[n][1];
         Form1->StringGrid2->ColCount = 2;
         Form1->StringGrid2->RowCount = 4;
         Form1->StringGrid2->Cells[0][0] = ci[0][0];
         Form1->StringGrid2->Cells[1][0] = ci[0][1];
         Form1->StringGrid2->Cells[0][1] = ci[n1][0];
         Form1->StringGrid2->Cells[1][1] = ci[n1][1];
         Form1->StringGrid2->Cells[0][2] = ci[n][0];
         Form1->StringGrid2->Cells[1][2] = ci[n][1];
         Form1->StringGrid2->Cells[0][3] = x0;
         Form1->StringGrid2->Cells[1][3] = y0;
         Form1->Edit9->Text = n1;
         Form1->Edit10->Text = n2;
         for(int i = 0,k;i < 2;i++){
                 if(i == 0)
                         k = n1;
                 else
                         k = n2;
                 for(int j = 0;j <= k;j++){
                         ai[i*n1+j][0] = ci[i*n1][0]+j*(ci[i*n1+k][0]-ci[i*n1][0])/k;
                         ai[i*n1+j][1] = ci[i*n1][1]+j*(ci[i*n1+k][1]-ci[i*n1][1])/k;
                         for(int q = 0;q <= m;q++){
                                 bkxy[(i*n1+j)*(m+1)+q] = new float[2];
                                 bkxy[(i*n1+j)*(m+1)+q][0] = ai[i*n1+j][0]+q*(bi[i*n1+j][0]-
ai[i*n1+j][0])/m;
                                 bkxy[(i*n1+j)*(m+1)+q][1] = ai[i*n1+j][1]+q*(bi[i*n1+j][1]-
ai[i*n1+j][1])/m;
                         }
                 }
         }
         for(int i = 0;i < tugk;i++){                  if(tur == 1||tur == 2)
                         bkxy[i][1] = 2*y0 - bkxy[i][1];
                 if(tur == 2||tur == 3)
                         bkxy[i][0] = 2*x0 - bkxy[i][0];
         }
         Form1->StringGrid6->Tag++;
         elmk = Form1->StringGrid6->Tag;
         Form1->StringGrid6->ColCount = 6;
         Form1->StringGrid6->RowCount = elmk;
         Form1->StringGrid6->Cells[0][elmk-1] = elmk;
         Form1->StringGrid6->Cells[1][elmk-1] = Form1->StringGrid4->Tag;
         Form1->StringGrid6->Cells[3][elmk-1] = m;
         Form1->StringGrid6->Cells[4][elmk-1] = n;
         Form1->StringGrid6->Cells[5][elmk-1] = l;
         pX = Form1->Edit3->Text.ToInt();
         pY = Form1->Edit4->Text.ToInt();
         x0 = Form1->Edit8->Text.ToDouble();
         y0 = Form1->Edit6->Text.ToDouble();
         alpha = Form1->Edit5->Text.ToDouble();
         ly = Form1->Edit2->Text.ToDouble();
         Form1->StringGrid4->ColCount = 6;
         Form1->StringGrid4->RowCount = Form1->StringGrid4->Tag;
         x2 = 0;
         for(int p = 0;p <= l;p++){
                 for(int i = 0,j;i < tugk;i++){
                         if(alpha != 0)
                                 lx = sqrt((bkxy[i][0]+pX-x0)*(bkxy[i][0]+pX-x0)+(bkxy[i][1]+pY-
y0)*(bkxy[i][1]+pY-y0))*cos(alpha)/sin(alpha);
                         else
                                 lx = 0;
                         length = ly + abs(lx);
                         x2++;
                         Form1->StringGrid4->Tag++;
                         j = Form1->StringGrid4->Tag;
                         Form1->StringGrid4->RowCount = j;
                         Form1->StringGrid4->Cells[0][j-1] = x2;
                         Form1->StringGrid4->Cells[1][j-1] = bkxy[i][0] + p*pX/l;
                         Form1->StringGrid4->Cells[2][j-1] = bkxy[i][1] + p*pY/l;
                         Form1->StringGrid4->Cells[3][j-1] = p*pX/l;
                         Form1->StringGrid4->Cells[4][j-1] = p*pY/l;
                         Form1->StringGrid4->Cells[5][j-1] = p*length/l;
                 }
         }
         Form1->StringGrid6->Cells[2][elmk-1] = Form1->StringGrid4->Tag;
         createrPolygon(elmk);
         polygonDraughter(elmk-1);
         restangleMathMod(tur);
         //comparer(elmk-1,elmk);
         //hangerArea(elmk-1,elmk);
         for(int i = 0;i <= n;i++){
                 delete ai[i];
                 delete bi[i];
                 delete ci[i];
         }
         writeToXLS();
         delete ai;
         delete bi;
         delete ci;
         for(int i = 0;i < tugk;i++)
                 delete bkxy[i];
         delete bkxy;
         delete txy;
         return 0;
}
void mouseCoordinate(int X,int Y){
         int w,h;
         w = Form1->Image1->Width;
         h = Form1->Image1->Height;
         Form1->Image1->Canvas->Pen->Color = clGray;
         Form1->Image1->Canvas->MoveTo(X,0);
         Form1->Image1->Canvas->LineTo(X,h);
         Form1->Image1->Canvas->MoveTo(0,Y);
         Form1->Image1->Canvas->LineTo(w,Y);              
         Form1->Image1->Canvas->Pen->Color = clWhite;
}
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
       int X, int Y)
{
         int x1,y1,x2,y2,tag = this->StringGrid1->Tag;
         this->Label2->Caption = X;          this->Label4->Caption = Y;
         if(switcher){
                 if(tag > 0&&this->StringGrid1->Cells[1][tag-1] != ""){
                         x1 = this->StringGrid1->Cells[1][tag-1].ToInt();
                         y1 = this->StringGrid1->Cells[2][tag-1].ToInt();
                         liner(25);
                         mouseCoordinate(X,Y);
                         miniEllipses();
                         if(tag > 1)
                                 draughter(0,0);
                         quarterEllipse(xy,x1,y1,X,Y);
                         this->StringGrid1->Cells[0][tag-1] = xy;
                 }
         }
         if(button3D){
                 int rc,tag = this->StringGrid8->Tag;
                 float length;
                 if(tag > 0&&tag != 3){  
                         liner(25);
                         miniEllipses();
                         rc = this->StringGrid8->Cells[0][tag-1].ToInt();
                         x1 = this->StringGrid1->Cells[1][rc].ToInt();
                         y1 = this->StringGrid1->Cells[2][rc].ToInt();
                         draughter3D(x1,y1,X,Y);
                         if(tag == 1){
                                 length = sqrt((X-x1)*(X-x1)+(Y-y1)*(Y-y1));
                                 this->Edit2->Text = length;
                         }
                         else{
                                 if(tag == 2){
                                         this->Edit3->Text = X-x1;
                                         this->Edit4->Text = Y-y1;
                                 }
                         }
                 }
         }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
         xy = 0;
         switcher = true;
         button3D = false;
}
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
       TMouseButton Button, TShiftState Shift, int X, int Y)
{
         int tag;
         if(switcher){
                 tag = this->StringGrid1->Tag;
                 if(tag > 1&&this->StringGrid1->Cells[1][tag-2] == ""||tag>1&&this->StringGrid1-
>Cells[0][tag-2]==3||tag == 1){
                         xs = this->StringGrid1->Cells[1][tag-1].ToInt();
                         ys = this->StringGrid1->Cells[2][tag-1].ToInt();
                 }
                 if(X>=(xs-4)&&X<=(xs+4)&&Y>=(ys-4)&&Y<=(ys+4)&&tag>1){
                         Form1->Image1->Canvas->LineTo(xs,ys);
                         Form1->StringGrid1->Tag++;
                         Form1->StringGrid1->Cells[0][tag-1] = xy;
                 }
                 else{
                         this->StringGrid1->Tag++;
                         tag = this->StringGrid1->Tag;
                         this->StringGrid1->ColCount = 3;
                         this->StringGrid1->RowCount = tag;
                         this->StringGrid1->Cells[1][tag-1] = X;
                         this->StringGrid1->Cells[2][tag-1] = Y;
                         if(tag>=2){
                                 this->StringGrid1->Cells[0][tag-2] = xy;
                         }
                         else
                                 this->StringGrid1->Cells[0][tag-1] = xy;
                 }
         }
         if(button3D){
                 int k,x0,y0,w;
                 bool scanner = false;
                 this->StringGrid8->ColCount = 2;                  for(int i = 0;i < this->StringGrid1->RowCount;i++){
                         if(this->StringGrid1->Cells[1][i] != ""){
                            x0 = this->StringGrid1->Cells[1][i].ToInt();
                            y0 = this->StringGrid1->Cells[2][i].ToInt();
                            if(X>=(x0-4)&&X<=(x0+4)&&Y>=(y0-4)&&Y<=(y0+4)){
                                 scanner = true;
                                 w = i;
                            }
                         }
                 }
                 if(scanner){
                         x0 = this->StringGrid1->Cells[1][w].ToInt();
                         y0 = this->StringGrid1->Cells[2][w].ToInt();
                         this->StringGrid8->Tag = this->StringGrid8->RowCount;
                         k = this->StringGrid8->Tag;
                         this->StringGrid8->Cells[0][k-1] = w;
                         this->StringGrid8->Cells[1][k-1] = X-x0;
                         this->StringGrid8->Cells[2][k-1] = Y-y0;
                 }
                 else{
                         this->StringGrid8->Tag = this->StringGrid8->RowCount;
                         k = this->StringGrid8->Tag;
                         if(k == 3){
                                 this->Edit8->Text = X;
                                 this->Edit6->Text = Y;
                                 this->StringGrid8->Cells[0][k-1] = this->Edit8->Text;
                                 this->StringGrid8->Cells[1][k-1] = this->Edit6->Text;
                                 this->StringGrid8->Cells[2][k-1] = this->Edit5->Text;
                         }
                         else
                                 button3D = false;
                 }
         }
         if(!mathModSw){
                 int x1,y1;
                 bool filtr = true;
                 this->StringGrid2->ColCount = 1;
                 for(int i = 0;i < this->StringGrid1->Tag;i++){
                         if(this->StringGrid1->Cells[1][i] != ""){
                                 x1 = this->StringGrid1->Cells[1][i].ToInt();
                                 y1 = this->StringGrid1->Cells[2][i].ToInt();
                                 if(X>=(x1-4)&&X<=(x1+4)&&Y>=(y1-4)&&Y<=(y1+4)){
                                         for(int j = 0;j < this->GroupBox1->Tag;j++)
                                                 if(this->StringGrid2->Cells[0][j].ToInt() == i)
                                                         filtr = false;
                                         if(filtr){
                                                 this->GroupBox1->Tag++;
                                                 tag = this->GroupBox1->Tag;
                                                 this->StringGrid2->RowCount = tag;
                                                 this->Label15->Caption = tag;
                                                 this->StringGrid2->Cells[0][tag-1] = i;
                                         }
                                         break;
                                 }
                         }
                 }
         }
         if(this->StringGrid8->RowCount == 3){
                 this->Edit8->Text = X;
                 this->Edit6->Text = Y;
         }
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
         mathModSw = false;
         switcher = false;
         this->GroupBox1->Show();
         this->GroupBox1->Tag = 0;
         this->GroupBox1->Caption = "Restangle";
         this->Button2->Tag++;
         this->Button3->Tag = 0;
         this->Button4->Tag = 0;
         this->Button11->Tag = 0;
         this->Label5->Hide();
         this->Edit1->Hide();
         this->Label14->Caption = "n";
         this->Label15->Caption = this->GroupBox1->Tag;
         if(this->StringGrid8->Tag == 0){
                 this->Label22->Hide();                  this->Edit7->Hide();
         }
         else{
                 this->Label22->Show();
                 this->Edit7->Show();
                 this->Label22->Top = 184;
                 this->Edit7->Top = 184;
         }
}
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
         this->GroupBox1->Hide();
         mathModSw = true;
         this->GroupBox1->Tag = 0;
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
         int tag = this->GroupBox1->Tag;
         if(this->Button2->Tag > 0){
                 if(tag == 4){
                         restangleMathMod(0);
                         this->GroupBox1->Hide();
                         aPolDr();
                 }
                 else
                         ShowMessage("Restangle koordinatarini toliq kiriting!");
         }
         else{
                 if(this->Button3->Tag > 0){
                         if(tag == 5){
                                 restangleEllipseMathMod();
                                 this->GroupBox1->Hide();
                                 aPolDr();
                         }
                         else{
                                 ShowMessage("Restangle Ellipse koordinatarini toliq kiriting!");
                         }
                 }
                 else{
                         if(this->Button4->Tag > 0){
                                 if(tag == 4){
                                         ellipseMathMod();
                                         this->GroupBox1->Hide();
                                         aPolDr();
                                 }
                                 else{
                                         ShowMessage("Ellipse koordinatarini toliq kiriting!");
                                 }
                         }
                         else{
                                 if(tag == 2){
                                         sphereMathMod();
                                         this->GroupBox1->Hide();
                                         aPolDr();
                                 }
                                 else{
                                         ShowMessage("Sphere koordinatarini toliq kiriting!");
                                 }
                         }
                 }
         }   
         miniEllipses();
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
         mathModSw = false;
         switcher = false;
         this->Button2->Tag = 0;
         this->Button3->Tag++;
         this->Button4->Tag = 0;
         this->Button11->Tag = 0;
         this->GroupBox1->Show();
         this->GroupBox1->Caption = "Restangle Ellipse";
         this->Label5->Show();
         this->Edit1->Show();
         this->Label14->Caption = "n1";
         this->GroupBox1->Tag = 0;          this->Label15->Caption = this->GroupBox1->Tag;
         if(this->StringGrid8->RowCount != 2){
                 this->Label22->Hide();
                 this->Edit7->Hide();
         }
         else{
                 this->Label22->Show();
                 this->Edit7->Show();
                 this->Label22->Top = 224;
                 this->Edit7->Top = 224;
         }
}
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
         this->GroupBox1->Hide();
         mathModSw = true;
         this->GroupBox1->Tag = 0;
}
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
         int tag = this->GroupBox1->Tag;
         if(tag == 5){
                 this->GroupBox1->Hide();
                 restangleEllipseMathMod();
         }
         else{
                 ShowMessage("koordinatarni toliq kiriting!");
         }
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{
         mathModSw = false;
         switcher = false;
         this->GroupBox1->Show();
         this->Button2->Tag = 0;
         this->Button3->Tag = 0;
         this->Button4->Tag++;
         this->Button11->Tag = 0;
         this->GroupBox1->Tag = 0;
         this->GroupBox1->Caption = "Ellipse"; 
         this->Label5->Show();
         this->Edit1->Show();
         this->Label14->Caption = "n1";
         this->Label15->Caption = this->GroupBox1->Tag;
         if(this->StringGrid8->RowCount != 2){
                 this->Label22->Hide();
                 this->Edit7->Hide();
         }
         else{
                 this->Label22->Show();
                 this->Edit7->Show(); 
                 this->Label22->Top = 224;
                 this->Edit7->Top = 224;
         }
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
         xy = 1;
         switcher = true; 
         button3D = false;
}
void __fastcall TForm1::Button6Click(TObject *Sender)
{
         xy = 2;
         switcher = true; 
         button3D = false;
}
void __fastcall TForm1::Button8Click(TObject *Sender)
{
         int id1,id2;
         id1 = Form1->ListBox1->ItemIndex;
         id2 = Form1->ListBox2->ItemIndex;
         if(id1 >= 0&&id2 >= 0&&id1!=id2){                  this->GroupBox4->Hide();
                 comparer(id1,id2);
                 hangerArea(id1,id2);
                 this->Cursor = crDefault;
                 liner(25);
                 polygonDraughter(id1);
                 oPolDr(id1);
         }
         else
                 ShowMessage("wrong");
}
void __fastcall TForm1::Button9Click(TObject *Sender)
{
         this->GroupBox4->Hide();
         this->Label17->Tag = 0;
         this->Label19->Tag = 0;
         this->StringGrid7->RowCount = 1;
         this->Cursor = crDefault;
}
void __fastcall TForm1::Button10Click(TObject *Sender)
{
         this->GroupBox2->Show();
         switcher = false;
}
void __fastcall TForm1::Button7Click(TObject *Sender)
{
         int row;
         row = this->StringGrid6->Tag;
         if(row > 0){
                 showerListItems();
                 mathModSw = true;
         }
         this->GroupBox4->Show();
}
void __fastcall TForm1::Button11Click(TObject *Sender)
{
         mathModSw = false;
         switcher = false;
         this->Button2->Tag = 0;
         this->Button3->Tag = 0;
         this->Button4->Tag = 0;
         this->Button11->Tag++;
         this->GroupBox1->Show();
         this->GroupBox1->Caption = "Sphere";
         this->Label5->Show();
         this->Edit1->Show();
         this->Label14->Caption = "n1";
         this->GroupBox1->Tag = 0;
         this->Label15->Caption = this->GroupBox1->Tag;
         if(this->StringGrid8->RowCount != 2){
                 this->Label22->Hide();
                 this->Edit7->Hide();
         }
         else{
                 this->Label22->Show();
                 this->Edit7->Show(); 
                 this->Label22->Top = 224;
                 this->Edit7->Top = 224;
         }
}
 
BOOL bSetupPixelFormat(HDC hdc)
{
     PIXELFORMATDESCRIPTOR pfd, *ppfd;
     int pixelformat;
     ppfd = &pfd;
     ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
     ppfd->nVersion = 1;
     ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
                         PFD_DOUBLEBUFFER;
     ppfd->dwLayerMask = PFD_MAIN_PLANE;
     ppfd->iPixelType = PFD_TYPE_COLORINDEX;
     ppfd->cColorBits = 8;
     ppfd->cDepthBits = 16;      ppfd->cAccumBits = 0;
     ppfd->cStencilBits = 0;
     if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
     {
         MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
         return FALSE;
     }
     if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
     {
         MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
         return FALSE;
     }
     return TRUE;
}
  
GLvoid initializeGL(GLsizei width, GLsizei height){
     GLfloat     maxObjectSize, aspect;
     GLdouble    near_plane;
     glClearIndex( (GLfloat)BLACK_INDEX);
     glClearDepth( 1.0 );
     glEnable(GL_DEPTH_TEST);
     glMatrixMode( GL_PROJECTION );
     aspect = (GLfloat) width / height;
     gluPerspective( 45.0, aspect, 3.0, 7.0 );
     glMatrixMode( GL_MODELVIEW );
     near_plane = 3.0;
     maxObjectSize = 3.0F;
     radius = near_plane + maxObjectSize/2.0;
     latitude = 0.0F;
     longitude = 0.0F;
     latinc = 0.0F;
     longinc = 0.5F;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
initializeGL(ClientRect.Right, ClientRect.Bottom);        
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
       TShiftState Shift)
{
Close();        
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Timer1->Enabled = false;
if (ghRC)
wglDeleteContext(ghRC);
         if(ghDC)
                 ReleaseDC(Handle, ghDC);
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
         this->Image1->Width = ClientRect.right;
         this->Image1->Height = ClientRect.Bottom;
resize(ClientRect.Right, ClientRect.Bottom);        
}
void __fastcall TForm1::Button12Click(TObject *Sender)
{
         if(this->StringGrid6->Tag > 0)                  this->Button12->Tag++;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
         int tag;
         tag = this->Button12->Tag;
         if(tag > 0){
                 Timer1->Enabled = false;
                 openGL(0);
                 Timer1->Enabled = true;
         }
}
void __fastcall TForm1::Button13Click(TObject *Sender)
{
         xy = 3;
         switcher = true; 
         button3D = false;
}
void selectedItem(int si){
         int s,e,col;
         String ss,s0,s1 = "Sohaning N tugun nuqtalar soni -> ";
         String sn = "\n",s2,s3 = "Sohaning M elementlar soni -> ";
         s = Form1->StringGrid6->Cells[1][si].ToInt();
         e = Form1->StringGrid6->Cells[2][si].ToInt();
         Form1->StringGrid12->ColCount = 4;
         Form1->StringGrid12->RowCount = e-s;
         s0 = e-s;
         for(int i = s;i < e;i++){
                 Form1->StringGrid12->Cells[0][i-s] = Form1->StringGrid4->Cells[0][i];
                 Form1->StringGrid12->Cells[1][i-s] = Form1->StringGrid4->Cells[1][i];
                 Form1->StringGrid12->Cells[2][i-s] = Form1->StringGrid4->Cells[2][i];
                 Form1->StringGrid12->Cells[3][i-s] = Form1->StringGrid4->Cells[5][i];
         }
         s = Form1->StringGrid6->Cells[6][si].ToInt();
         e = Form1->StringGrid6->Cells[7][si].ToInt();
         col = Form1->StringGrid3->ColCount;
         Form1->StringGrid13->ColCount = col-1;
         Form1->StringGrid13->RowCount = e-s;
         s2 = e-s;
         for(int i = s;i < e;i++)
                 for(int j = 1,x;j < col;j++){
                         x = Form1->StringGrid3->Cells[j][i].ToInt();
                         Form1->StringGrid13->Cells[j-1][i-s] = Form1->StringGrid4->Cells[0][x];
                 }
         ss = s1 + s0 + sn + s3 + s2;
         Form1->Memo1->Text = ss;
}
void __fastcall TForm1::Button14Click(TObject *Sender)
{
         int row,si = 0;
         String s0,s1,s2 = "- chi soha";
         row = this->StringGrid6->Tag;
         for(int i = 0,x;i < row;i++){
                 x = this->StringGrid6->Cells[0][i].ToInt();
                 s1 = x;
                 s0 = s1 + ' ' + s2;
                 this->ListBox3->Items->Add(s0);
         }
         this->ListBox3->ItemIndex = 0;
         selectedItem(si);
         this->Image1->Hide();
         this->Panel1->Hide();
         this->Width = 831;
         this->Panel2->Show();
}
void __fastcall TForm1::Button15Click(TObject *Sender)
{
         this->Image1->Show();
         this->Panel1->Show();
         this->Width = 1232;
         this->Panel2->Hide();
}
void __fastcall TForm1::Button16Click(TObject *Sender) {
         button3D = true;
         this->StringGrid8->Tag = 0;
         this->StringGrid8->RowCount = 1;
}
void __fastcall TForm1::Button19Click(TObject *Sender)
{               
         this->GroupBox2->Hide();        
}
void __fastcall TForm1::Button20Click(TObject *Sender)
{
         button3D = true;
         this->StringGrid8->Tag = 0;
         this->StringGrid8->RowCount = 3;
}
void __fastcall TForm1::Button18Click(TObject *Sender)
{
         this->GroupBox2->Hide();        
}
void __fastcall TForm1::ListBox3Click(TObject *Sender)
{
         int list;
         list = this->ListBox3->ItemIndex;
         selectedItem(list);
}
void __fastcall TForm1::Button17Click(TObject *Sender)
{
         button3D = true;
         this->StringGrid8->Tag = 0;
         this->StringGrid8->RowCount = 2;
}
void __fastcall TForm1::Button21Click(TObject *Sender)
{
         this->Button12->Tag = 0;
         this->GroupBox3->Hide();
         this->Image1->Show();
         this->Panel1->Show();
}
Купить
  • Похожие документы

  • Agros test
  • Strategik boshqaruvda kompyuter modellashtirish
  • O’zbekiston yosh rassomlari asarlarini sotishga qaratilgan platformani yaratish loyihasi
  • Android tizimli telefonlar uchun skaner ilovasini yaratish
  • Web 2.0 servislar orqali oʻquv jarayonini tashkil etish

Подтвердить покупку

Да Нет

© Copyright 2019-2026.

  • Инструкция по снятию с баланса
  • Контакты
  • Инструкция использования сайта
  • Инструкция загрузки документов
  • O'zbekcha