Site hosted by Angelfire.com: Build your free website today!

3 boyutlu küp çizimi 

Bu kısımda adım adım basit bir üç boyutlu küpün oluşturulması anlatılacaktır. Programlama dili olarak VB 5.0 kullanılmıştır.

Şimdi ekranda bir küp oluşturalım. Küpün sanal dünyadaki koordinatları verilecek ve iki boyutlu ekranda hesaplama sonucunda oluşturulacaktır. Küpün sekiz adet köşesi tanımlandıktan sonra aralarında çizgiler çizilecektir. Köşe koordinatları:

p0 (0,0,0)
p1 (100,0,0)
p2(0,100,0)
p3(100,100,0)
p4(0,0,100)
p5(100,0,100)
p6(0,100,100)
P7(100,100,100)

olacaktır. Bu işlemleri başka bir programlama dili ile de yapabilirsiniz. Özellikle C++ bu tür işlemler için biçilmiş kaftandır. Ancak burada Visual Basic kullanılacaktır .VB içinden yeni bir proje oluşturun ve formunuza bir PictureBox nesnesi ekleyin. Çizimleri bunun içine yaptıracağız. Daha sonra koordinat bilgilerini tutacağımız bir array (dizi) oluşturalım. Bir module ekleyerek module1 altındaki General Declerations bölümünde tip ve değişken tanımlamalarını yapıyoruz. Bu şekilde basit bir yapısal programlama yapacağız.

Bir noktayı tanımlayan tip:

Type TDPoint

Control As Boolean

X As Double

Y As Double

Z As Double

End Type

Bir kenarı tanımlayan tip

Type TDEdge

Control As Boolean

p1 As TDPoint

p2 As TDPoint

End Type

Bir küpü tanımlayan tip : 8 köşe ve 12 kenardan oluşuyor.

Type TDCube

Control As Boolean

Point(7) As TDPoint

Edge(11) As TDEdge

End Type

 

 

Global cube As TDCube

Global dist as Integer

Oluşturduğumuz dizinin içine Form1 in Load eventi içinde değerleri yerleştirelim.

Private Sub Form_Load()

cube.Point(0).x = 0

cube.Point(0).y = 0

cube.Point(0).Z = 0

cube.Point(1).x = 100

cube.Point(1).y = 0

cube.Point(1).Z = 0

cube.Point(2).x = 0

cube.Point(2).y = 100

cube.Point(2).Z = 0

cube.Point(3).x = 100

cube.Point(3).y = 100

cube.Point(3).Z = 0

cube.Point(4).x = 0

cube.Point(4).y = 0

cube.Point(4).Z = 100

cube.Point(5).x = 100

cube.Point(5).y = 0

cube.Point(5).Z = 100

cube.Point(6).x = 0

cube.Point(6).y = 100

cube.Point(6).Z = 100

cube.Point(7).x = 100

cube.Point(7).y = 100

cube.Point(7).Z = 100

cube.Edge(0).p1 = cube.Point(0)

cube.Edge(0).p2 = cube.Point(1)

cube.Edge(1).p1 = cube.Point(0)

cube.Edge(1).p2 = cube.Point(2)

cube.Edge(2).p1 = cube.Point(2)

cube.Edge(2).p2 = cube.Point(3)

cube.Edge(3).p1 = cube.Point(1)

cube.Edge(3).p2 = cube.Point(3)

cube.Edge(4).p1 = cube.Point(4)

cube.Edge(4).p2 = cube.Point(5)

cube.Edge(5).p1 = cube.Point(4)

cube.Edge(5).p2 = cube.Point(6)

cube.Edge(6).p1 = cube.Point(6)

cube.Edge(6).p2 = cube.Point(7)

cube.Edge(7).p1 = cube.Point(5)

cube.Edge(7).p2 = cube.Point(7)

cube.Edge(8).p1 = cube.Point(4)

cube.Edge(8).p2 = cube.Point(0)

cube.Edge(9).p1 = cube.Point(6)

cube.Edge(9).p2 = cube.Point(2)

cube.Edge(10).p1 = cube.Point(7)

cube.Edge(10).p2 = cube.Point(3)

cube.Edge(11).p1 = cube.Point(5)

cube.Edge(11).p2 = cube.Point(1)

dist = 256 'Uzaklık

mpx = 15 'küpü kolay yoldan büyük çizdirebilmek için çarpan

Picture1.AutoRedraw = True 'Picture1 in değişiklikleri otomatik çizmesi için

Drawer 'Çizici

End Sub

Module1 içine iki adet fonksiyon ekliyoruz. Bunlar defalarca yapacağımız hesaplama işlemlerinde bize kolaylık sağlayacaktır.

Public Function hsx(X As Double, Z As Double, dist As Double) 'Horizontal center of screen

hsx = dist * X / (dist + Z)

End Function

Public Function hsy(Y As Double, Z As Double, dist As Double) 'Vertical center of screen

hsy = dist * Y / (dist + Z)

End Function

Drawer adı altında yeni bir alt program yazalım. Çizimleri yapacak olan kısım budur.

 

Sub Drawer()

Dim x, y As Double

Dim j As Integer

Dim p1 As TDPoint

Dim p2 As TDPoint

 

For j = 0 To 7

x = (Picture1.Width / 2) + (mpx * hsx(cube.Point(j).x, cube.Point(j).Z, dist))

y = (Picture1.Height / 2) + (mpx * hsy(cube.Point(j).y, cube.Point(j).Z, dist))

Picture1.PSet (x, y), 2

 

Next

For j = 0 To 11

 

p1.x = (Picture1.Width / 2) + (mpx * hsx(cube.Edge(j).p1.x, cube.Edge(j).p1.Z, dist))

p1.y = (Picture1.Height / 2) + (mpx * hsy(cube.Edge(j).p1.y, cube.Edge(j).p1.Z, dist))

p2.x = (Picture1.Width / 2) + (mpx * hsx(cube.Edge(j).p2.x, cube.Edge(j).p2.Z, dist))

p2.y = (Picture1.Height / 2) + (mpx * hsy(cube.Edge(j).p2.y, cube.Edge(j).p2.Z, dist))

 

Picture1.Line (p1.x, p1.y)-(p2.x, p2.y)

Next

End Sub

Programı çalıştırdığınızda yukarıdaki görüntüyü elde etmelisiniz. Bir sonraki adımda küpü hareket ettirme ve döndürme işlemlerini yapıyoruz.

  Halit Can