GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

Çember Oluşumu - Trigonometri

Başlatan squarepants, 28 Kasım 2019, 22:31:35

« önceki - sonraki »

0 Üye ve 3 Ziyaretçi konuyu incelemekte.

squarepants

Herkese selam , umarım gününüz iyi gidiyordur. Bu yazımda sizlere Çember Nedir ? , Çemberin ana oluşum mantığı nedir ? vb. gibi konulardan bahsetmeye çalışacağım. Tabii konuyu en iyi şekilde anlayabilmek için biraz Trigonometri bilginizin olması gerekiyor ancak ben yine de elimden geldiğince size bahsetmeye çalışacağım.

Çember Nedir ?

Çember , bir merkez noktası bulunan , ve bu merkez noktası etrafında yarıçap uzunluğuna bağlı olarak değişkenlik gösteren uzaklıklarda ard arda sıralanan sonsuz noktalardan meydana gelen bir yuvarlak görüntü olarak tanımlayabiliriz.



Bu noktalar belirlenen açılar ile 360 dereceyi tamamlayana kadar devam ettirilmesi neticesinde oluşur. Yani örneğin 30 derecelik açılarla oluşturulan yeni noktalar 360 dereceyi tamamlayarak döngü son şeklini almış olur. Nokta hesabını 360/n(Derece) formülü ile hesaplayabiliriz , 30 derece örnek olarak verilir ise 360 / 30 = 12 noktadan meydana gelen bir Çemberden söz etmiş oluruz.



Çemberin Ana Oluşum Mantığı

Çemberin ana oluşum mantığı , yukarıda da bahsettiğimiz gibi sözü edilen açının 360 dereceyi tamamlayana kadar kendi içerisinde bulunduğu bir tip döngüdür. Peki bu nokta koordinatları nasıl belirleniyor ? , noktaları açılarına göre dik üçgenleri kullanarak sinus ve cosinus hesabı yaparak dik eksene olan paralel uzaklık değeri ile yatay eksene olan paralel uzaklık değerini bulmuş oluyoruz. Trigonometride , fonksiyonlar konusundaki X ve Y eksenleri yerine sinus ve cosinus eksenleri vardır. Sinus yatay eksene olan paralel uzaklık olmakla beraber , cosinus ise dikey eksene olan paralel uzaklıktır.

Konu hakkında fazla bilgisi olmayan arkadaşlar için sin ve cos hesabı :

sinus = karşı / hipotenüs(Yarıçap da diyebiliriz)  cosinus = komşu / hipotenüs




Aşağıdaki resimde de görüldüğü üzere 30 dereceye ait bir açının sinus ve cosinus değerleri hesaplanmış ve oluşan yeni nokta (Cos(30),Sin(30)) koordinatları uzerinde olmuş oluyor. Peki 0.5 ile 0.86 gibi değerler nasıl bulunuyor ? , bu değerler açılarına göre özel üçgen kurallarından veya trigonometrik cetvel tablosundan hazır olarak verilen sayısal verilerin hesaplanması ile bulunuyor. Örneğin 30-60-90 üçgenine göre 30 derecenin karşısı hipotenüsün yarısına , 60 derecenin karşısı ise karşı dik kenarın kök 3 katına eşittir ; yani hipotenüs(yarıçap) 1 ise , 1/2 = 0.5 bize sin değerini , 0.5'in kök 3 katı ise 0.86 cos değerini veriyor. Bunu diğer bir yöntem ile Trigonometrik Cetvel ile yapmak da mümkündür. Hangisi size kolay geliyor ise o yolu tercih edebilirsiniz.



Trigonometrik Cetvel :



Örnek 30-60-90 üçgenine ait bir açı - kenar ilişkisi :



Yani aslında Çemberler birbiri ardına oluşan dik üçgenlerden meydana gelir dersek yanlış olmaz.

Peki GTA SA-MP Platformunda Ne İşimize Yarayacak ?

İçinde bulunduğunuz duruma göre bir veya birden fazla konuda işinize yarayabilir. Örneğin Pawn derleyicisini kullanarak hazırlamış olduğum bir fonksiyon üzerinden gidelim.

PAWN Kodu: Seç
stock Tur(playerid, model, Float:uzaklik = 0.0, Float:Aci = 0.0)
{

Çember oluşturmak için ihtiyaç duyduğumuz parametrik değişken isimlerini tanımlıyoruz. Bunlar uzaklik(YARIÇAP) , Aci(Açı değeri) , model(Obje ID). Evet , herhangi bir objeyi kullanarak çember bir görüntü elde etmeye çalışacağız.

PAWN Kodu: Seç
stock Tur(playerid, model, Float:uzaklik = 0.0, Float:Aci = 0.0)
{
    new Float:xyzpos[3],Float:sin,Float:cos;
    new vid , intid;
    GetPlayerPos(playerid,xyzpos[0],xyzpos[1],xyzpos[2]);  // Çember Merkez Noktası
    vid = GetPlayerVirtualWorld(playerid); // obje için alınan dünya ID
    intid = GetPlayerInterior(playerid); // obje için alınan dekoratör ID

Çember oluşturabilmek için ilk olarak bir Merkez Noktamız olmalı , ve bu bizim bulunduğumuz X ve Y koordinatları olacak. Genel olarak 2 boyutlu bir koordinat düzleminde çalışıyoruz ancak obje yükseklik değerleri için Z eksenini de kullanmamız gerekiyor. Float veri tipinde xyzpos , sin ve cos değerlerinin sayısal verilerini çekmek için Float veri tipinde sin ve cos ve son olarak objenin içinde bulunduğu Dünya ve Dekoratör ID verilerini çekebilmek için ise int veri tipinde vid ve intid değişkenlerini tanımlıyoruz.
Merkez Noktamız oluşturuldu , gerekli World & Interior ID verileri elde edildi.


PAWN Kodu: Seç
stock Tur(playerid, model, Float:uzaklik = 0.0, Float:Aci = 0.0)
{
      new Float:xyzpos[3],Float:sin,Float:cos;
      new vid , intid;
      GetPlayerPos(playerid,xyzpos[0],xyzpos[1],xyzpos[2]);  // Çember Merkez Noktası

     vid = GetPlayerVirtualWorld(playerid); // obje için alınan dünya ID
     intid = GetPlayerInterior(playerid); // obje için alınan dekoratör ID
     for(new Float:i; i < 360.0; i = i + Aci)  // Açımız için oluşturulan döngü
     {
          sin = floatsin(i,degrees) * uzaklik; // Yaricap'a bagli Y eksenine paralel uzaklık
          cos = floatcos(i,degrees) * uzaklik; // Yaricap'a bagli X eksenine paralel uzaklık
          //CreateObject(model, xyzpos[0]+cos, xyzpos[1]+sin, xyzpos[2],0.0, 0.0,96.0, 300.0);  kullanılabilir , sınırlı obje kapasitesi
          CreateDynamicObject(model, xyzpos[0]+cos, xyzpos[1]+sin, xyzpos[2],0.0,0.0, 96.0, vid,intid,playerid,300.0);
     }
     return 1;
}

Evet , Merkez noktamız oluşturuldu ancak Çember oluşumu için birbiri ardına tekrar eden bir açıya ve bu açıya ait cosinus ve sinus değerlerinin hesaplanmasına ihtiyacımız var. Yukarıda da anlattığım gibi sin ve cos hesabı için bizim yapmamız gereken işlemleri var , ancak floatsin ve floatcos fonksiyonları bu işlemleri bizim için yerine getiriyor. Bu sebepten dolayı bu iki fonksiyonu cos ve sin hesabı için kullandık. Ancak bizim elde ettiğimiz cos ve sin değerleri belirtilen YARIÇAP uzunluğuna göre değişiklik gösterir. Bunu bir formül üzerinden anlatmak gerekirse sin(x) = Karşı / R(YARIÇAP) ise sin(x) * R = Karşı denkleminden oluşan yeni değerlerin Yarıçapa bağlı olmasını anlayabiliyoruz , aynı kural cosinus için de geçerlidir. Belirtilen Açının 360 dereceye tamamlanabilmesi için bir döngü oluşturuyoruz ve döngü boyunca oluşan yeni sin ve cos değerlerini hesaplattırıyoruz. Oluşan yeni noktanın Koordinatı , bizim oluşturduğumuz Merkez Noktasına bağlı olarak oluşan yeni X ve Y değerleridir.

Bu sebepten dolayı xyzpos[0]+cos ve xyzpos[1]+sin Objenin oluşacağı yeni noktaları temsil eder. Son olarak ise Z ekseni yani xyzpos[2] bizim yükseklik değerimiz olacaktır , Oyuncunun Z eksenine bağlı olarak değişen yükseklik değeri aynı zamanda Objenin yüksekliğidir. Bu arada CreateObject() fonksiyonu yerine SA-MP forum üyesi  Incognito tarafından geliştirilen streamer kütüphanesini kullanmayı tercih ettim. Tercih etmemin ana sebebi CreateObject() fonksiyonunun sahip olduğu sınırlı obje sayısı kapasitesini kullanmak yerine CreateDynamicObject() fonksiyonu ile daha fazla obje spawn edilebilirlik özelliğini kullanmayı tercih etmemdir.

Örnek Komut Kullanımı :
PAWN Kodu: Seç
CMD:cemberyap(playerid,params[])
{
new mdl;
new Float:udeger , Float:aci;
if(sscanf(params,"dff",mdl,udeger,aci)) return SendClientMessage(playerid,-1,"Kullanim : /cemberyap [Modelid] [Yarıçap] [Açı]");
        Tur(playerid, mdl, udeger, aci);
return 1;
}


Konuyu kısa ve öz bir şekilde özetlemeye çalıştım. Umarım biraz olsun konuyu size nakil edebilmişimdir. Herkese İyi Forumlar.
Son düzenlenme: 20 Aralık 2019, 00:12:39 ThePosition

Specter


Saygılarımla Specter...

lacosapalm

Elinize sağlık, gayet güzel bir anlatım.  :helal:

- S O N

Caner K.


squarepants

Alıntı yapılan: Specter - 28 Kasım 2019, 22:32:15
Çok yararlı bir konu olmuş.
Alıntı yapılan: lacosapalm - 30 Kasım 2019, 01:47:05
Elinize sağlık, gayet güzel bir anlatım.  :helal:
Alıntı yapılan: Caner K. - 30 Kasım 2019, 09:17:53
Yararlı bir konu olmuş.
Yorumlarınız için Teşekkürler.
Son düzenlenme: 30 Kasım 2019, 14:46:20 ThePosition

Joker

Harika bir anlatım, fazla detaylı. Ellerine sağlık.

open.mp Turkey Department Manager
victimrp.com founder

TheLucifer


squarepants

Alıntı yapılan: Joker - 30 Kasım 2019, 15:27:08
Harika bir anlatım, fazla detaylı. Ellerine sağlık.
Alıntı yapılan: TheLucifer - 30 Kasım 2019, 15:42:41
Güzelmiş :) Eyvallah.
Yorumlarınız için Teşekkürler ^^


Myalis


squarepants

Alıntı yapılan: Myalis - 01 Aralık 2019, 20:24:10
ellerine sağlık, teşekkürler
Teşekkürler yorumun için , Eğer konu anlamana yardımcı olduysa sorun yok ^^


Kripteks

Böyle kaliteli içerik görmiyeli uzun zaman oldu.  :helal:


squarepants

Alıntı yapılan: Kripteks - 02 Aralık 2019, 22:53:04
Böyle kaliteli içerik görmiyeli uzun zaman oldu.  :helal:
Teşekkürler , umarım anlamana yardımcı olmuştur.


Codes.

Benim anlatmak istediğimi daha iyi anlatmışsın başarılı. :)

https://www.gtamulti.com/forum/index.php?topic=14458.0
Son düzenlenme: 19 Aralık 2019, 21:34:34 TAKTAK26 Sebep: Güncel++

squarepants

Alıntı yapılan: TAKTAK26 - 19 Aralık 2019, 21:29:17
Benim anlatmak istediğimi daha iyi anlatmışsın başarılı. :)

https://www.gtamulti.com/forum/index.php?topic=14458.0
Evet , konu başlığı açısından Trigonometriye değiniyor . Yorumun için teşekkürler ^.^
Son düzenlenme: 19 Aralık 2019, 23:58:27 ThePosition