Güzel Bir Animasyon
Krank Biyel mekanizması dönme hareketini doğrusal harekete çeviren veya doğrusal hareketten dönme hareketi elde eden bir sistemdir. Mesela otomobil motorlarındaki pistonlar gibi.
Formül
________________________________________
s = r( 1 - cos (A) ) - ( r / (L * 2) ) * r * sin (A)^2
denklemde ikinci - işareti yerine + işareti konulursa dönme yönü değişir. Şimdi bu formülü kullanarak değişken krank ve biyel değerlerinde bir animasyon programı yapalım.
Program Nesneleri ve Ayarları
________________________________________
Nesneler ve Ayarları :
(PictureBox)
Name = ekran
Backcolor = mavi ayarlayın.
AutoRedraw = True
Width= 10095
Height = 6975
(TextBox) Krank Yarıçapı Değeri İçin.
(TextBox) Biyel Mesafesi İçin.
(Timer)
Enabled = False
Interval = 100
(HScroll)
Max = 3
Min = 1
Value = 2
(CommandButton)
Caption = Başla
(CommandButton)
Caption = Durdur
Enabled = False
PictureBox�ın sağ üst köşesine gelecek şekilde, picturebox�un içine bir adet (Label)
Name = Label4
ForeColor = AçıkSarı
Caption = �Açı = 0�
(Line)
Name = Line1
X1 = 0
X2 = 10080
Y1 = 3480
Y2 = 3480
BorderColor = Açıkmavi
BorderStyle = 4
(Line)
Name = Line2
X1 = 3000
X2 = 3000
Y1 = 0
Y2 = 6840
BorderColor = AçıkMavi
BorderStyle = 4
(Line)
Name = Krank
BorderColor = Turuncu
BorderWidth = 10
Visible = False
Konumu Önemli Değil
(Line)
Name = Biyel
BorderColor = Yeşil
BorderWidth = 10
Visible = False
Konumu Önemli Değil
Line nesnelerini picturebox içine koyun. Tüm nesneler ve Ayarları Bu Kadar... Program görünümü aşağıdaki gibi olabilir.
Ekran Geometrisi :
________________________________________
Kullanıcı text1 ve text2 kutucuklarına sırasıyla krank yarıçapı ve biyel uzunluğu değerlerini girerler. Başla butonuna basıldığında önce krankın hareketini tanımlayan çember çizdirilir. Asal eksenin koordinatları için yatay ve düşey sabitleri tuttum. Bu şekilde sanal ( 0 , 0 ) noktasını elde ettim.
Const yatay = 300
Const dusey = 348
Bu değerleri deneme-yanılma metoduyla buldum. Çemberi bu noktaya çizdiririz. Çember rengi beyaz
Ekran.Circle ( yatay , dusey ) , Text1.Text , RGB ( 255, 255 , 255 )
Krank ve Biyel ilk olarak 0 derecedeki konumlarında yerleştirilirler.. Krank kolu 0 derecede aşağıdaki konumda olur.
krank.X1 = yatay
krank.Y1 = dusey
krank.X2 = yatay + Text1.Text
krank.Y2 = dusey
Aynı şekilde biyel kolu da aşağıdaki konumdadır.
biyel.X1 = krank.X2
biyel.Y1 = krank.Y2
biyel.X2 = biyel.X1 + Text2.Text
biyel.Y2 = krank.Y2
Sürekli Açı Değeri Elde Etmek :
________________________________________
Timer nesnesi ile kolayca açı değerleri türetebiliriz. Timer nesnesi sürekli olarak tekrarlı işlemler yapacaktır. Bir sayac değişkeni koyarsak bu değişkenin değeri sürekli artarak gidecektir. Burada MOD operatörünü kullanarak değişkenin belli bir değerde sıfırlanmasını sağlayabiliriz. MOD operatörü matematikteki MOD işine yarar.
açı = açı + 10
ifadesi ile sürekli 10 ar 10 ar değer arttırırız. Her seferinde bu değişkenin mod 360 daki değerini elde etmek için aşağıdaki işlemi yaparız.
açı = açı mod 360
İkisini birleştirelim:
açı = ( açı + 10 ) Mod 360
Şimdi krankın çember etrafında dönüşünü yaptıralım. Analitik geometriden hatırlanacağı üzere çember üzerindeki herhangi bir noktanın koordinatı
X = R * cos ( A )
Y = R * sin ( A ) ile hesaplanıyordu. Bu iki formül yardımıyla krankın çember üzerindeki noktasını elde edebiliriz. Bilindiği gibi tüm programlama dillerinde açılar Radyan cinsindendir. Bunu Derece cinsine çevirmek için pi / 180 ile çarpmak lazımdır. Bunun için drc adında bir sabit tanımladım.
Const drc = 3.14159265 / 180
krankx = yatay + ( r * Cos ( aci * drc ))
kranky = dusey - ( r * Sin ( aci * drc ))
Bu iki değer o an çember üzerindeki hareketli noktanın koordinatlarını verir. Şimdi hareketin özüne gelelim. Krank kolunun bir ucu çember merkezinde sabit diğer ucu da bu hareketli noktadadır. Biyel kolunun bir ucu bu hareketli noktada ve diğer ucu hareketlidir. Bu hareketlilik aslında düşeyde değişmez. Sadece yatayda değişir. Değişim miktarı ne kadardır? S kadar.
Şimdi bu bilgileri yerleştirelim..
krank.X1 = krankx
krank.Y1 = kranky
krank.X2 = yatay
krank.Y2 = dusey
biyel.X1 = krankx
biyel.Y1 = kranky
biyel.X2 = s
biyel.Y2 = dusey
İşte bu kadar. Tüm geometrik ifadeleri nesneler üzerine yerleştirdik. Aşağıda tüm programı bulabilirsiniz.
Const yatay = 300 ' Asal Eksen yatay noktası
Const dusey = 348 ' Asal Eksen dusey noktası
Const drc = 3.141592 / 180 ' Radyan-Derece Dönüşüm Katsayısı
Dim aci As Integer
Private Sub Form_Load()
ekran.Scale (0, 0)-(1004, 692)
aci = 0
End Sub
Private Sub Command1_Click()
ekran.Cls
aci = 0
' Boyut Kontrolleri
If Text1.Text < 40 Or Text1.Text > 200 Then
MsgBox "Krank Yarıçapı değerini 40 ile 200 arasında Girin", vbInformation, "Boyut Hatası"
Exit Sub
End If
If Text2.Text < (Text1.Text * 2.2) Or Text2.Text > 500 Then
MsgBox "Biyel kolu krank yarıçapının 2.2 katından az ve 500'den büyük olamaz.", vbInformation, "Boyut Hatası"
Text2.Text = Fix(Text1.Text * 2.2) + 1
Exit Sub
End If
' ekrana krank çemberi çiziliyor...
ekran.Circle (yatay, dusey), Text1.Text, RGB(255, 255, 255)
' krank ayarı yapılıyor...
krank.X1 = yatay
krank.Y1 = dusey
krank.X2 = yatay + Text1.Text
krank.Y2 = dusey
krank.Visible = True
' Biyel ayarı yapılıyor...
biyel.X1 = krank.X2
biyel.Y1 = krank.Y2
biyel.X2 = biyel.X1 + Text2.Text
biyel.Y2 = krank.Y2
biyel.Visible = True
' Bilgi Girişi Kapatılıyor..
Text1.Enabled = False
Text2.Enabled = False
Command2.Enabled = True
Command1.Enabled = False
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
' İşlem Durduruluyor...
Timer1.Enabled = False
Text1.Enabled = True
Text2.Enabled = True
Command1.Enabled = True
Command2.Enabled = False
End Sub
Private Sub HScroll1_Change()
' Yatay kaydırma çubuğu ile timer nesnesinin interval özelliği kontrol ediliyor...
Label3.Caption = "Hız (" & HScroll1.Value & "/3) :"
Timer1.Interval = (4 - HScroll1.Value) * 50
End Sub
Private Sub Timer1_Timer()
' Açı değeri 10 luk birimlerde artacak...
aci = (aci + 10) Mod 360
Label4.Caption = "Açı : " & aci
' Formül karışmasın diye iki değişken daha tanımladım...
r = Text1.Text
L = Text2.Text
s = (yatay + Text1.Text + Text2.Text) - (r * (1 - Cos(aci * drc)) + (r ^ 2 / (L * 2)) * Sin(aci * drc) ^ 2)
' Krank Kolunun Çember Üzerindeki Temas Noktası Hesaplanıyor..
krankx = yatay + (r * Cos(aci * drc))
kranky = dusey - (r * Sin(aci * drc))
' Krank Kolu Çiziliyor...
krank.X1 = krankx
krank.Y1 = kranky
krank.X2 = yatay
krank.Y2 = dusey
' Biyel Kolu Çiziliyor...
biyel.X1 = krankx
biyel.Y1 = kranky
biyel.X2 = s
biyel.Y2 = dusey
End Sub