nesneyi daire ustunde hareket ettirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

nesneyi daire ustunde hareket ettirme

Mesaj gönderen Lord_Ares »

formun uzerine bir daire şekil olduğunu varsayalım. programı çalıştırınca mouse, belli bir mesafe ile bu dairenin etrafında dönsün isityorum.
şekli çizmesine gerek yok, olan şeklin etrafında dönsün bunu nasıl yaparım fikri olan varmı.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen mkysoft »

sinus ve cosinus fonksiyonlarını kullanın, biraz geometri.
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen qamyoncu »

Analitik Geometri'de elips fonksiyonu:

Kod: Tümünü seç

x2/a2 + y2/b2 = 1
x yatay konumu,
y dikey konumu,
a yatay yarıçapı,
b dikey yarıçapı..

Çember'e uyarladığımızda (a=b olacaktır):

Kod: Tümünü seç

 x2 + y2 = r2
x yatay konumu,
y dikey konumu,
r yarıçapı..

Fakat bunlar merkezi orijin olan denklemlerdir.

Merkezi (x1,y1) olan bir çemberin denklemi:

Kod: Tümünü seç

(x-x1)2 + (y-y1)2 = r2

Fazla mı Matematik yaptım acaba :lol:

Buradan X'i veya Y'yi yalnız bırakarak farenin olması gereken konumunu bulabilirsiniz. (Merkezi (50,50) yarıçapı 30 olan bi çemberi çizmeye X'e 20 verip, X'e 80 verene kadar for döngüsü ile Y'yi hesaplatıp SetCursorPos(X,Y: Integer) ile fareyi götürebilirsiniz.

Açıklayıcı olmuştur umarım..
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen Lord_Ares »

:) dostum senin gibi matematik dahisi olursam bunu yaparım. Bu bana fazla sanırım :)
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen qamyoncu »

İltifat olarak algılıyorum, teşekkürler.. :)

50x50 px'lik bir alanda fareyi çembersel hareket yaptıracağımızı varsayalım. Bu hareketin merkezi yani çemberin merkezi (200,200) noktası olsun.

Şimdi tüm işlemlerimizi aslında lisede öğrendiğimiz (0,0) noktası merkezli çember çiziyormuşcasına yapalım. Daha sonra yüksekliğe ve genişliğe 200 piksel ekleriz ve istediğimiz yerde çemberi çizdirmiş oluruz. İlk işimiz Y'yi yalnız bırakmak.

Kod: Tümünü seç

x2 + y2 = r2    //çember denklemi
Y = kök( r2 - x2)    // Y'nin yalnız bırakılmış hali..
Kodlarsak:
var
Y: Double;
begin
Y:=sqrt(sqr(r)-sqr(x));
...
end;
Burada, X'ini verdiğimizde Y değerini bulucaz. Peki X'e kaç vericez? Nasıl vericez?

- 0,0 noktasından başlatacaktır işlemlere. Doğal olarak X'in en sol noktası -50 olacaktır (50x50 boyutunda istiyorduk) En sağ noktası ise +50 olur. Ve X'in tüm değerleri bu noktalar arasında değişecektir. Burda 2 nokta önemli.
- Saat yönünde mi hareket yapıcaz yoksa aksi yönde mi? Saat yönünde yaptığımızı varsayıyorum.
- Harekete nerden başlayacağız? En sol noktadan başladığımızı varsayıyorum.

Basit bir for döngüsü ile işimizi halledicez.

Kod: Tümünü seç

var
Y: Double;
I: Integer;
begin

for I:=-50 to 50 do                             // Ee yarıçap 50piksel idi.
begin
Application.ProcessMessages;             // Hareketi gözlemleyebilmek için.
Y:=sqrt(sqr(50) - sqr(i));
SetCursorPos(200+i,200-round(Y));       //200'ler başlangıç noktamızı 200,200 belirlediğimiz için. "-Y" kullanmam ise, saat yönünde çizdiğim için..
sleep(10);                                            
end;
...
end;
Bu kod ile, Yarım bir çember hareketi gözlersin. Fare en sol noktadan başlar, yukarıdan en sağ noktaya kadar yaklaşık 1 saniyede gelir..
Alt kısmını da benzer kodla yazabilirsin. Kolay gelsin.

// Denedim fakat bende 1saniyede gelmedi. Nedenini anlayamadım. Toplam 3 saniye civarında sürüyor benimki. Diğer kodlardan dolayı diyeceğim ama bu kadar uzun sürmemesi gerekmez mi?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen emin_as »

Trigonometriyle de kolayca halledebilirsin.

Sin ve kosinus fonksiyonları bu işler için kullanılır.
y ekseninde sinus ile x eksenini ise cosinus ile hesaplattırabilirsin.

Kod: Tümünü seç

for aci:=0 to 359 do
begin
   x:=cos(degtorad(aci)*cepbercap+koordinatx;
   y:=sin(degtorad(aci))*cembercapi+koordinaty;
   setcursorpos(x,y);
end;
Aci cemberin yariçapı, koordinatx ve koordinaty cemberin merkezinin x ve y cinsinden koordinatı.
Delphide sin, cos gibi fonksiyonlar derece degil radyan olarak bilgi kabul ederler.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: nesneyi daire ustunde hareket ettirme

Mesaj gönderen Lord_Ares »

arkadaşlar çok teşekkürler verdiğiniz kod ve bilgiler sayesinde istediğimi yapabildim.
Cevapla