Bu yazımda küp dışındaki bazı geometrik cisimlerin tel-kafes yöntemi ile nasıl üretebileceğimizi göstereceğim.
1.Dikdörtgen Prizma
Küpteki tek bir kenarının uzunluğu olan "Uzunluk" argümanı yerine "a, b, c" argümanları yazarak her bir kenarın uzunlğunu ayrı ayrı tanımlayabiliriz. Her bir köşenin koordinatları şu şekilde olacaktır :
Bunu fonksiyon şeklinde yazarsak :
/**@Tanım : Istenen buyuklukte, koordinatta ve renkte prizma yaratan fonksiyon *@Parametreler : Prizma = yaratilmak istenen Objenin adresi, * x, y, z = Objenin koordinatlari * a, b, c = Prizmanin her bir kenarinin uzunlugu * Renk = Objenin cizgilerinin rengi */ void GL_3DDikdortgenPrizma(GL_Obje *Prizma, float x, float y, float z, double a, float b, float c, uint16_t Renk) { //Noktalari olustur float Prizma_Noktaklari[8][3] = { x, y, z, x + a, y, z, x + a, y, z + c, x, y, z + c, x, y + b, z, x + a, y + b, z, x + a, y + b, z + c, x, y + b, z + c }; //Hangi noktalarin birbiri ile birlesecegini belirle uint16_t Prizma_Cizgileri[12][2] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; //Noktalar ve Cizgiler icin dinamik bellekte yer ayir ve onceden hesaplanmis //degerleri bu ayrilan yere kopyala float *_Prizma_Noktalari = (float *)malloc(sizeof(Prizma_Noktaklari)); memcpy(_Prizma_Noktalari, Prizma_Noktaklari, sizeof(Prizma_Noktaklari)); uint16_t *_Prizma_Cizgileri = (uint16_t *)malloc(sizeof(Prizma_Cizgileri)); memcpy(_Prizma_Cizgileri, Prizma_Cizgileri, sizeof(Prizma_Cizgileri)); //Hesaplanan butun degerleri Prizma'ya at Prizma->NoktaSayisi = 8; Prizma->CizgiSayisi = 12; Prizma->Noktalar = (float (*)[3])_Prizma_Noktalari; Prizma->Cizgiler = (uint16_t (*)[2])_Prizma_Cizgileri; Prizma->Koordinat[0] = x; Prizma->Koordinat[1] = y; Prizma->Koordinat[2] = z; Prizma->Merkez[0] = x + a / 2; Prizma->Merkez[1] = y + b / 2; Prizma->Merkez[2] = z + c / 2; Prizma->Renk = Renk; }
2.Piramit
Piramit içinde yukarıdaki gibi bir şekil çizilip her bir köşenin koordinatı hesaplanak aşağıdaki gibi bir fonksiyon yazılabilir.
/**@Tanım : Istenen buyuklukte, koordinatta ve renkte piramit yaratan fonksiyon *@Parametreler : Piramit = yaratilmak istenen Objenin adresi, * x, y, z = Objenin koordinatlari * a, b = Piramitin her bir kenarinin uzunlugu * h = Piramitin yüksekligi * Renk = Objenin cizgilerinin rengi */ void GL_3DPiramit(GL_Obje* Piramit, float x, float y, float z, double a, float b, float h, uint16_t Renk) { //Noktalari olustur float Piramit_Noktalari[5][3] = { x, y, z, x + a, y, z, x + a, y, z + b, x, y, z + b, x + a / 2, y + h, z + b / 2}; //Hangi noktalarin birbiri ile baglanacagini belirle uint16_t Piramit_Çizgileri[8][2] = { 0, 1, 1, 2, 2, 3, 3, 0, 0, 4, 1, 4, 2, 4, 3, 4}; //Noktalar ve Cizgiler icin dinamik bellekte yer ayir ve onceden hesaplanmis //degerleri bu ayrilan yere kopyala float *_Piramit_Noktalari = (float *)malloc(sizeof(Piramit_Noktalari)); memcpy(_Piramit_Noktalari, Piramit_Noktalari, sizeof(Piramit_Noktalari)); uint16_t *_Piramit_Çizgileri = (uint16_t *)malloc(sizeof(Piramit_Çizgileri)); memcpy(_Piramit_Çizgileri, Piramit_Çizgileri, sizeof(Piramit_Çizgileri)); //Hesaplanan butun degerleri Piramat'e at Piramit->NoktaSayisi = 8; Piramit->CizgiSayisi = 12; Piramit->Noktalar = (float (*)[3])_Piramit_Noktalari; Piramit->Cizgiler = (uint16_t (*)[2])_Piramit_Cizgileri; Piramit->Koordinat[0] = x; Piramit->Koordinat[1] = y; Piramit->Koordinat[2] = z; Piramit->Merkez[0] = x + a / 2; Piramit->Merkez[1] = y + h / 2; Piramit->Merkez[2] = z + b / 2; Piramit->Renk = Renk; }
3.Silindir
Silindir yaratmak için taban ve tavana birer daire çizip bunları birleştirmek yeterlidir. 2-boyutlu koordinat sisteminde açılı ve uzunluğundaki bir noktasının koordinatı şu şekilde bulunur :
çözünürlük olmak üzere , açılı noktaların birleşimi ile çözünürlükte bir çember elde edilir.
/**@Tanım : Istenen buyuklukte, koordinatta ve renkte silindir yaratan fonksiyon *@Parametreler : Silindir = Yaratilmak istenen Objenin adresi * Cozunurluk = Objenin kenar sayisi * x, y, z = Objenin koordinatlari * Uzunluk = Silindirin uzunlugu * Yaricap = Silindirin yaricapi * Renk = Objenin cizgilerinin rengi */ void GL_3DSilindir(GL_Obje* Silindir, int Cozunurluk, float x, float y, float z, float Uzunluk, float Yaricap, uint16_t Renk) { //Silindirin merkez koordinatlarini belirle Silindir->Merkez[0] = x; Silindir->Merkez[1] = y + Uzunluk / 2; Silindir->Merkez[2] = z; //Silindirin koordinatlarini belirle Silindir->Koordinat[0] = x; Silindir->Koordinat[1] = y; Silindir->Koordinat[2] = z; //Noktalar ve Cizgiler icin dinamik bellekte yer ayir float *_Silindir_Noktalari = (float *)malloc((Cozunurluk * 2) * sizeof(float) * 3); uint16_t *_Silindir_Cizgileri = (uint16_t *)malloc((3 * Cozunurluk) * sizeof(uint16_t) * 2); //NoktaSayisi, CizgiSayisi gibi elemanlari Silindir'e at Silindir->NoktaSayisi = Cozunurluk * 2; Silindir->CizgiSayisi = 3 * Cozunurluk; Silindir->Noktalar = (float (*)[3])_Silindir_Noktalari; Silindir->Cizgiler = (uint16_t (*)[2])_Silindir_Cizgileri; Silindir->Renk = Renk; //Noktalarin belirlenmesi for(int i = 0; i < Cozunurluk; i++) { //Alt tabanin noktalari Silindir->Noktalar[i][0] = x + Yaricap * cos((float)2 * PI * i / Cozunurluk); Silindir->Noktalar[i][1] = y; Silindir->Noktalar[i][2] = z + Yaricap * sin((float)2 * PI * i / Cozunurluk); //Ust tavanin noktalari Silindir->Noktalar[i + Cozunurluk][0] = x + Yaricap * cos((float)2 * PI * i / Cozunurluk); Silindir->Noktalar[i + Cozunurluk][1] = y + Uzunluk; //Ust tavan icin y'ye Uzunluk ekle Silindir->Noktalar[i + Cozunurluk][2] = z + Yaricap * sin((float)2 * PI * i / Cozunurluk); } //Noktalarin birleştirilmesi for(int i = 0; i < Cozunurluk; i++) { //Alt taban noktalarinin birlestirilmesi Silindir->Çizgiler[i][0] = i; Silindir->Çizgiler[i][1] = (i + 1) % Cozunurluk; //Ust tavan noktalarinin birlestirilmesi Silindir->Çizgiler[i + Cozunurluk][0] = i + Cozunurluk; Silindir->Çizgiler[i + Cozunurluk][1] = (i + 1) % Cozunurluk + Cozunurluk; //Alt taban ile ust tavan arasındaki noktalarin birlestirilmesi Silindir->Çizgiler[i + 2 * Cozunurluk][0] = i; Silindir->Çizgiler[i + 2 * Cozunurluk][1] = i + Cozunurluk; } }
4.Küre
Kürenin koordinatlarının hesaplanması için silindirde yapılan işlemin 3D olarak yapılması gerekir.
ve açılarının tarayacağı alan ise şu şekildedir :
,
/**@Tanım : Istenen buyuklukte, koordinatta ve renkte kure yaratan fonksiyon *@Parametreler : Kure = Yaratilmak istenen Objenin adresi * YuzukSayisi = Kuredeki yatay ve dikey yuzuk sayisi (Cozunurluk) * x, y, z = Objenin koordinatlari * Yaricap = Kurenin yaricapi * Renk = Objenin cizgilerinin rengi */ void GL_3DKure(GL_Object* Kure, int YuzukSayisi, float x, float y, float z, float Yaricap, uint16_t Renk) { //Merkez noktalarinin belirle Kure->Merkez[0] = x; Kure->Merkez[1] = y; Kure->Merkez[2] = z; //Koordinatlari belirle Kure->Koordinat[0] = x; Kure->Koordinat[1] = y; Kure->Koordinat[2] = z; //Noktalar ve Cizgiler icin dinamik bellekte yer ayir float *_Kure_Noktalari = (float *)malloc((YuzukSayisi * (YuzukSayisi + 1)) * sizeof(float) * 3); uint16_t *_Kure_Cizgileri = (uint16_t *)malloc((2 * YuzukSayisi * YuzukSayisi - YuzukSayisi) * 2 * 2); //NoktaSayisi, CizgiSayisi gibi elemanlari Kure'ye at Kure->NoktaSayisi = YuzukSayisi * (YuzukSayisi + 1); Kure->CizgiSayisi = 2 * YuzukSayisi * YuzukSayisi - YuzukSayisi; Kure->Noktalar = (float (*)[3])_Kure_Noktalari; Kure->Cizgiler = (uint16_t (*)[2])_Kure_Cizgileri; Kure->Renk =Renk; //Noktalrin koordinatlarini hesapla for(int i = 0; i < YuzukSayisi; i++) { for(int j = 0; j < (YuzukSayisi + 1); j++) { Kure->Noktalar[i * (YuzukSayisi + 1) + j][0] = x + Yaricap * cos((float)2 * PI * i / YuzukSayisi) * sin(PI * j / YuzukSayisi); Kure->Noktalar[i * (YuzukSayisi + 1) + j][1] = y + Yaricap * sin((float)2 * PI * i / YuzukSayisi) * sin(PI * j / YuzukSayisi); Kure->Noktalar[i * (YuzukSayisi + 1) + j][2] = z + Yaricap * cos(PI * j / YuzukSayisi); } } for(int i = 0; i < YuzukSayisi; i++) { for(int j = 0; j < YuzukSayisi; j++){ //Dikey yuzukleri birlestir Kure->Cizgiler[j + i * YuzukSayisi][0] = j + i * (YuzukSayisi + 1); Kure->Cizgiler[j + i * YuzukSayisi][1] = j + i * (YuzukSayisi + 1) + 1; //Yatay yuzukleri birlestir Kure->Cizgiler[j + i * YuzukSayisi + YuzukSayisi * YuzukSayisi][0] = j * (YuzukSayisi + 1) + i + 1; Kure->Cizgiler[j + i * YuzukSayisi + YuzukSayisi * YuzukSayisi][1] = ((j + 1) * (YuzukSayisi + 1)) % (YuzukSayisi * YuzukSayisi + YuzukSayisi) + i + 1; } } }