nesneyi daire ustunde hareket ettirme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
nesneyi daire ustunde hareket ettirme
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ı.
şekli çizmesine gerek yok, olan şeklin etrafında dönsün bunu nasıl yaparım fikri olan varmı.
Re: nesneyi daire ustunde hareket ettirme
sinus ve cosinus fonksiyonlarını kullanın, biraz geometri.
Re: nesneyi daire ustunde hareket ettirme
Analitik Geometri'de elips fonksiyonu:
x yatay konumu,
y dikey konumu,
a yatay yarıçapı,
b dikey yarıçapı..
Çember'e uyarladığımızda (a=b olacaktır):
x yatay konumu,
y dikey konumu,
r yarıçapı..
Fakat bunlar merkezi orijin olan denklemlerdir.
Merkezi (x1,y1) olan bir çemberin denklemi:
Fazla mı Matematik yaptım acaba
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..
Kod: Tümünü seç
x2/a2 + y2/b2 = 1
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
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

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..'
'Yükseldikçe küçülen bir uçurtma..'
Re: nesneyi daire ustunde hareket ettirme


Re: nesneyi daire ustunde hareket ettirme
İ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.
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.
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?

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;
- 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;
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..'
'Yükseldikçe küçülen bir uçurtma..'
Re: nesneyi daire ustunde hareket ettirme
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.
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.
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;
Delphide sin, cos gibi fonksiyonlar derece degil radyan olarak bilgi kabul ederler.
Re: nesneyi daire ustunde hareket ettirme
arkadaşlar çok teşekkürler verdiğiniz kod ve bilgiler sayesinde istediğimi yapabildim.