Profili Göster

Point Sınıfı ve Manuel Yöntemle İki Obje Arasındaki Uzaklığı Bulmak (Distance)

Ersin Şengül Tarih: 5/09/2008 Yorum: 0 adet

Okunma : 417 Tutanlar: Bu yazıyı 1 kişi tuttu.

Her zaman işin önce mantığının kavranması gerektiğine inanan birisi olarak, iki nokta arasındaki uzaklığın basit teoremini inceleyelim. Sonra bunu önce manuel sonar point sınıfı ile nasıl hesaplarız bu görelim.

Amacımız aşağıdaki mavi ve gri renkte bulunan movieclip’lerin arasındaki uzaklığı bulmak. Bu movieclip’lerimizin instance name’lerine ise A ve B olara verdiğimizi düşünelim.

MMİstanbul

Öncelikle geometri kurallarına bakarak biraz karıştıralım.

MMİstanbul

Yukarıda gördüğümüz dik üçgen aslında bizim tam aradığımız yapıyı oluşturmaktadır.
a, b ve c ismiyle 3 adet kenarı olan bir üçgen. Pisagor bağıntısını hepimiz okul yıllarımızda görmüşüzdür. Basit bir teorem, Dik açıyı oluşturan iki kenarın karesinin toplamları, dik üçgenin karşısında bulunan kenarın karesine eşittir. Yani;

a2 + b2 = c2

Bu bizim iki nokta arasındaki mesafeyi bulmak için temel teoremimiz olacak. Peki nasıl ? Devam edelim.

Flash içerisinde (CS4 ile gelen Z koordinatını düşünmüyoruz.), her objenin bir x’I ve y’si olduğu gibi, her noktanında x ve y değerleri olmak zorundadır. Bu düşünceye gore üçgenimizi aşağıdaki gibi güncelleyelim.

MMİstanbul

Gördüğünüz gibi I ve III noktalarının x ve y değerlerini belirttik. Dikkat ederseniz. I noktası bizim yukarıdaki A movieclip’imize, III noktası ise B movieclip’imize benzer bir konumda. Yine yukarıdaki A ve B movieclip’imizin arasındaki mesafe, aslında üçgendeki c (hipotenüs) kenarına denk gelmektedir. Tekrar formülümüze dönelim,

a2 + b2 = c2;

bu formula biraz açalım ki x ve y koordinatlarını da düşünerek tekrar yazalım. X ve y koordinatlarını düşünüyorsak ve c kenarını hesaplamak istiyorsak, öncelikle a ve b kenarlarının uzunluğunu bulmamız lazım.

a kenarı yatay olduğu için I . ve III noktanın x değerlerinin farkına eşit olacaktır. Y koordinatı ile a’nın herhangi bir bağlantısı bulunmuyor. Bu duruma gore

a kenar uzunluğu = (x2 – x1);

MMİstanbul

Yine bu duruma gore b kenarının uzunluğu ise, y koordinatları farkına eşit olacaktır.

b kenar uzunluğu = (y2 – y1);

MMİstanbul

Kemarlarımızın uzunluğunu bulduğumuza gore, artık c (hipotenüs) uzunluğunu rahatlıkla hesaplayabiliriz. Formülümüze tekrar geri dönelim ve bulduklarımızı yerlerine koyalım.

MMİstanbul

Evet işimize yarayacak formülümüzü, flash da bulunan koordinatlara uyarlamış olduk. Şimdi ise, flash’da bulunan A ve B isimli movieclip’lerimizi bu koordinata nasıl benzeticez bunu görelim.

MMİstanbul

Yukarıda da görüldüğü gibi, movieclip’lerin x ve y değerleri, yukarıda bahsettiğimiz

x1 --> A.x
 x2 --> B.x
 y1 --> A.y
 y2  --> B.y

değerlerine denk gelmektedir. Yine buradan yola çıkarak yukarıda bulduğumuz formülün son halini actionscript olarak yazalım ve A movieclip’I ile B movieclip’I arasındaki mesafeyıi( üçgendeki c (hipotenüs) kenarına denk gelmektedir.) bulalım. Öncelikle mesafenin değerini saklayacak Number very tipine ait bir değişken tanımlıyoruz.

var  mesafe:Number;

Daha sonra formülümüzü değişkenimize eşitliyoruz. Pozitif çıkması için y değerlerini ters yazıyorum, bu keyfi bir durum. Hemen bir şeyi belirtelim. Actionscript de direct olarak karesi yazamayacağımıza gore Math sınıfına ait pow() metodunu kullanabiliriz. Math.pow(); bizden 2 adet number parametresi bekler. 2. değer kadar 1. Değeri kendisi ile carp.

Örneğin;

Math.pow(4,3);

yazarsak. Bunun anlamı 3 adet 4 rakamının çarpılması demek ( 444). Sonuç, 64 edecektir. Förmülümüzü hemen ham haliyle hatırlayalım.

c2 = a2 + b2;

c olarak belittiğimiz bizim "mesafe" değişkenimize denk gelmektedir. Bu da hesaplamadan sonar, mesafe değişkenin değerinin karekökünü almamız gerektiğini söylüyor.

mesafe =  Math.pow((A.x - B.x) , 2) + Math.pow((B.y - A.y) , 2);

Bu işlemden sonra, aradaki uzaklık, "mesafe" değişkeninin kareköküne denk gelmektedir. Bu net sonuca ulaşmak için ise,

mesafe = Math.sqrt(mesafe) ;

satırını yazdığımızda, artık A ve B movieclip’lerinin arasındaki mesafeyi bulmuş oluruz.

Point() sınıfını kullarak basitçe hesaplamaya gelmeden önce, bu kadar uzun anlatmamın sebebine gelirsek; geometrik işlemlerde temel mantığı kavramak, tamamen size özel işlemleri geliştirmek için çok önemlidir.

Şimdi gelelim Point sınıfını kullanmaya.

Ekranda A ve B isimli 2 adet movieclip’imiz var. Amacımız 2 nokta arasındaki mesafeyi hesaplamak. (A ve B’nin registration noktaları arasındaki fark).

Elimizde 2 adet nokta olduğuna gore, demek ki 2 adet Point nesne örneği oluşturacağız. Point nesnesini class içerisinde tanımlıyorsanız, öncelikle point class’ını bu class’ınıza import etmelisiniz.

import flash.geom.Point;

Bu bilgiyide verdikten sonra, hemen konumuza dönelim.

Point tanımlarken bizden 2 adet parameter bekler. Bu parametreler , point nesnesinin x ve y değerleri olacaktır. İster sabit rakam yazar ve istediğimiz bir yerde sanal noktalar oluşturmuş oluruz. İstersek bir movieclip’in x ve y koordinatlarını yazar ve o movieclip üzerinde nokta oluşturmuş oluruz.

Biz A ve B movieclip’lerinin aralarındaki mesafeyi alacağımıza gore A movieclip’inin x ve y sini tutan bir point oluşturucaz. B movieclip’I içinde aynı işlemi yapıcaz.

A movieclip’ini temsil edecek point nesnesine pA ve B movieclip’ini temsil edecek point nesnesine de pB ismini verirsek. Artık bunları tanımlayabiliriz.

var pA:Point = new Point(A.x , A.y);
var pB:Point = new Point ( B.x, B.y );

artık mesafeyi (distance) hesaplayabiliriz.

var mesafe:Number = Point.distance (pA , pB);

Yukarıdaki Point sınıfı içerisinde static tanımlanmış olan distance metoduna 2 adet noktayı gönderiyoruz. distance() ise bize, bu iki nokta arasındaki mesafeyi hesaplıyor ve geri döndürüyor. Biz bu dönen uzaklık değerini ise, "mesafe" değişkenine atayarak, basit bir şekilde hesaplamış oluyoruz.

Dikkat edilmesi gereken bir nokta ise;

Eğer, point’leri tanımladıktan sonra, movieclip’lerin koordinatlarında bir değişiklik yaparsanız, mutlaka bu değeri point’in ilgili değerine güncelinin atılmasını sağlamalısınız. Örneğin;

A.x = 125;

Olarak değiştirdiniz. Hemen pointi güncellememiz lazım ki doğru bir distance bize dönsün. Bunu ise;

pA.x  = A.x;

şeklinde yapabiliriz. Buradan da anlaşılacağı gibi, point noktalarının tanımlandıktan sonra da, direct olarak x ve y değerlerini değiştirebiliyoruz.

Iyi çalışmalar dilerim.

aç-kapa İçeriğin rss beslemesi kullanımda değil Yorumlar

İçeriğe kayıtlı yorum bulunmuyor. İlk yorumu siz buradan ekleyebilirsiniz.


yeni üyelik | şifremi unuttum

aç-kapa Çalıştay Dirty99, 9. Pazarlama Zirvesi Etkinliği

Dirty99, 9. Pazarlama Zirvesi Etkinliği

Dirty99, 9. Pazarlama Zirvesi süresince 99 özel pazarlama profesyoneli ile, 99 dakikalık bir workshop çalışması! Özellikle interaktif pazarlama araçla...
Kategori: Çalıştay

aç-kapa Yarışma Fikir10000 Dijital Pazarlama Fikir Yarışması

Fikir10000 Dijital Pazarlama Fikir Yarışması

ADTECH tarafından düzenlenen Fikir10000 yarışmasına; dijital pazarlama ile ilgili size ait olan fikrinizle katılabilir ve 10.000 YTL’lik birinci...
Kategori: Yarışma

aç-kapa Yarışma 7Dx Demoscene Party

7Dx Demoscene Party

2002 yılından beri amatör bilgisayar kültürü ile ilgilenen insanları bir araya getirmeyi hedefleyen 7DX parti serisinin bu seneki ayağı olan 7D8 Demo ...
Kategori: Yarışma

aç-kapa Eğitim Türkiye'de İnternet Konferansı - Internet Teknolojileri Derneği -22-23 Aralık ODTÜ

Türkiye'de İnternet Konferansı - Internet Teknolojileri Derneği -22-23 Aralık ODTÜ

Etkin Katılım Çağrısı Türkiye’de Internet ile ilgili grupları biraraya getirerek İnternet’i tum boyutlarıyla tanıtmak, gelistirmek, tartı...
Kategori: Eğitim

aç-kapa Konferans Bilgi Güvenliği ve Kriptoloji Konferansı

Bilgi Güvenliği ve Kriptoloji Konferansı

Önemli Tarihler: Etkinlik Tarihi : 24-26 Aralık 2008 Son Bildiri Gönderme Tarihi : 20 Ekim 2008 Bildiri Kabul Tarihi Bildirimi :...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 696 (1 kayıtlı, 695 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

coldfusion mysql ubuntu
 
sponsor adobe istanbul