DAFTAR PUSTAKA 1. Ramadhan, Arif, 2004. Seri Penuntun Praktis Microsoft Visual Basic. Jakarta: Elex Media Komputindo. 2. Santoso, I. P., 1994, Grafika Komputer dan Antarmuka Grafis, Andi, Yogjakarta. 3. Suyoto, Dr., 2003, Teori dan Pemprograman Grafika Komputer dengan Visual C++ V.b dan OpenGL, Gavamedia, Yogjakarta 4. Yuswanto, 2002, Visual Basic 6.0 Pemprograman Grafis & Multimedia, Prestasi Pustaka Publisher, Surabaya 5. http://lecturer.eepisits.edu/~nana/index_files/materi/grafika/teori/pertemuan 9_Grafik%203%20Dimensi(1).pdf 6. http://www.scribd.com/doc/74599978/10/rotasi 7. http://lenterajiwaku.files.wordpress.com/2012/09/gf-minggu8.pdf 8. http://library.binus.ac.id/ecolls/ethesis/bab2/2012-1-00241- if%20bab%202.pdf 9. http://trisnowlaharwetan.wordpress.com/2010/02/05/mengenal-windows-api/ 10. http://ramajinx2.wordpress.com/simple-trick/win32-api-windows-32-bit- %E2%80%93-application-programming-interface-2/ 75
LAMPIRAN Dim FPS As Integer Dim Running As Boolean Listing Program FrmSplash (frmpembuka.frm) Option Explicit Private Type SwirlParticles Angle As Single angleadd As Single X As Integer Y As Integer CurX As Integer CurY As Integer Red As Byte Green As Byte Blue As Byte Rad As Single radadd As Single End Type Dim I As Long Dim merah, hijau, biru As Integer Dim Swirl() As SwirlParticles Dim TMax As Integer Dim PicWidth As Integer Dim PicHeight As Integer Dim PicWH As Integer Dim PicWHd2 As Integer Private Sub angleadd() Dim X As Integer For X = 0 To TMax Swirl(X).angleadd = -Swirl(X).angleadd Private Sub radadd() Dim X As Integer For X = 0 To TMax Swirl(X).radadd = -Swirl(X).radadd Private Sub Check4_Click() SwirlAngleRad Private Sub Form_Load() Dim X As Integer PicWidth = Picture1.ScaleWidth PicHeight = Picture1.ScaleHeight PicWH = Sqr(PicWidth ^ 2 + PicHeight ^ 2) Randomize Time TMax = 1000 ReDim Swirl(TMax) As SwirlParticles For X = 0 To TMax Swirl(X).Angle = Int(Rnd * 361) 76
77 Swirl(X).angleadd = (Rnd * 0.07) Swirl(X).X = PicWidth / 2 Timer2.Enabled = True Swirl(X).Y = PicHeight / 2 Swirl(X).Rad = Rnd * PicWH / 2 Swirl(X).radadd = Rnd * 3 Swirl(X).Red = (Rnd * 55) Swirl(X).Green = (Rnd * 55) Swirl(X).Blue = (Rnd * 255) Me.Show 'Running = True PicWHd2 = PicWH / 2 'SwirlScreen Timer2.Enabled = True angleadd radadd ReDim Swirl(TMax) As SwirlParticles For X = 0 To TMax Swirl(X).Angle = Int(Rnd * 361) Swirl(X).X = PicWidth / 2 Swirl(X).Y = PicHeight / 2 Swirl(X).Rad = Rnd * PicWH / 2 SwirlAngle SwirlRad SwirlColorsRGB Picture1.Cls Private Sub Label1_Click() frmsplash.hide MDIForm1.Show Private Sub Timer1_Timer() Me.Caption = "Swirl - " & FPS & " FPS" FPS = 0 Private Sub Timer2_Timer() Dim X As Integer For X = 0 To TMax Swirl(X).Angle = Swirl(X).Angle + Swirl(X).angleadd If Swirl(X).Angle > 360 Then Swirl(X).Angle = 0 If Swirl(X).Rad > PicWHd2 Then Swirl(X).Rad = 0 If Swirl(X).Rad < 0 Then Swirl(X).Rad = PicWHd2 Swirl(X).Rad = Swirl(X).Rad + Swirl(X).radadd SetPixel Picture1.hdc, Swirl(X).CurX, Swirl(X).CurY, 0 Swirl(X).CurX = Swirl(X).X + Swirl(X).Rad * (Cos(Swirl(X).Angle)) Swirl(X).CurY = Swirl(X).Y + Swirl(X).Rad * (Sin(Swirl(X).Angle))
78 SetPixel Picture1.hdc, Swirl(X).CurX, Swirl(X).CurY, RGB(Swirl(X).Red, Swirl(X).Green, Swirl(X).Blue) FPS = FPS + 1 Private Sub SwirlColorsRed() Dim X As Integer Randomize Time For X = 0 To TMax Swirl(X).Red = Rnd * 255 Private Sub SwirlColorsGreen() Dim X As Integer Randomize Time For X = 0 To TMax Swirl(X).Green = Rnd * 255 Private Sub SwirlColorsBlue() Dim X As Integer Randomize Time For X = 0 To TMax Swirl(X).Blue = Rnd * 255 Private Sub SwirlAngle() Dim X As Integer For X = 0 To TMax Swirl(X).angleadd = (Rnd * 40) / 100 For X = 0 To TMax Swirl(X).angleadd = (40) / 100 For X = 0 To TMax Swirl(X).angleadd = -((40) / 100) Private Sub SwirlRad() Dim X As Integer For X = 0 To TMax Swirl(X).radadd = (Rnd * 20) / 2 For X = 0 To TMax Swirl(X).radadd = (20) / 2 For X = 0 To TMax Swirl(X).radadd = -((20) / 2) Private Sub SwirlAngleRad() Dim X As Integer For X = 0 To TMax Swirl(X).radadd = (Rnd * 20) / 2
79 Swirl(X).angleadd = (Rnd * 40) / 100 For X = 0 To TMax Swirl(X).radadd = (20) / 2 Swirl(X).angleadd = (40) / 100 Private Sub SwirlColorsRGB() Dim X As Integer Randomize Time For X = 0 To TMax Swirl(X).Red = Rnd * 255 Swirl(X).Green = Rnd * 255 Swirl(X).Blue = Rnd * 255 Private Sub Timer3_Timer() I = I + 1 If I = 1000000 Then I = 0 merah = Int(255 * Rnd) hijau = Int(255 * Rnd) biru = Int(255 * Rnd) lbljudul1.forecolor = RGB(merah, hijau, biru) lbljudul2.forecolor = RGB(merah, hijau, biru) lblnama.forecolor = RGB(merah, hijau, biru) lblnim.forecolor = RGB(merah, hijau, biru) lblfakultas.forecolor = RGB(merah, hijau, biru) lbljurusan.forecolor = RGB(merah, hijau, biru) Line1.BorderColor = RGB(merah, hijau, biru) Listing Program MDIForm1 (formmenurotasi.frm) Private Sub cascade_click() Me.Arrange vbcascade Private Sub horizontal_click() Me.Arrange vbtilehorizontal Private Sub mnuabout_click() frmabout.show Private Sub mnukeluar_click() End Private Sub rotasi3d_click() sumbuxyz.show Private Sub rotasix_click() sumbux.show Private Sub rotasiy_click()
80 sumbuy.show Dim Sides(100) As Verticies 'sisi objek 100 Private Sub rotasiz_click() sumbuz.show Dim Sides1(100) As Verticies 100 Dim XSides(100) As Verticies 100 'sisi objek 'titik rotasi X Private Sub vertical_click() Me.Arrange vbtilevertical Listing Program sumbux (sumbux.frm) Dim Angle As Double Dim AngleHolder As Double sudut rotasi sebelumnya 'Sudut Rotasi 'holder untuk Dim NumObjectSides As Integer 'Jumlah sisi yang membentuk objek Private Type Point X As Double Y As Double Z As Double 'Susunan titik 'Lokasi koordinat X 'Lokasi koordinat Y 'Lokasi koordinat Z Dim XSides1(100) As Verticies X 100 Dim YSides(100) As Verticies 100 Dim YSides1(100) As Verticies Y 100 Dim ZSides(100) As Verticies 100 Dim ZSides1(100) As Verticies 100 Dim Sides3D(100) As Verticies 3D 100 'titik rotasi 'titik rotasi Y 'titik rotasi 'titik rotasi Z 'titik rotasi Z 'titik rotasi Dim Sides3D1(100) As Verticies 'titik rotasi 3D 100 Dim CosAng(359) As Double menahan Angles Cosine Dim SinAng(359) As Double menahan Sine Angles 'untuk 'untuk End Type Dim Center As Point Private Type Verticies NumPoints As Integer pada garis Points(40) As Point baris 40 Normal As Point End Type 'titik pusat 'sisi simpul 'Jumlah titik 'titik akhir setiap 'bidang normal Private Type POINTAPI 'ini adalah Poin ditarik dari objek untuk mengisinya X As Long 'dan menarik dengan cepat menggunakan fungsi win api Y As Long End Type Dim tmp() As POINTAPI 'Fungsi untuk menggambar Poligon secara cepat
81 Private Declare Function Polygon Lib "gdi32" _ BUTNOKAY_Click 'mengatur sudut dan menampilkan kembali posisi ke 0 (ByVal hdc As Long, lppoint As POINTAPI, ByVal ncount As Long) As Long Private Sub BUTNOKAY_Click() 'mengatur sudut dan membentuk Rotasi Private Sub BUTNStart_Click() Timer1.Enabled = True menggambar secara otomatis 'mulai AngleHolder = AngleHolder + 5 'menaikkan derajat sudut If AngleHolder = 360 Then ulang sudut kembali ke 0 AngleHolder = 0 If AngleHolder > 360 Then sudut kembali ke 0 'atur 'atur ulang Private Sub BUTNStop_Click() Timer1.Enabled = False menggambar secara otomatis Private Sub cepat_click() Timer1.Enabled = True 'berhenti AngleHolder = 0 TEXTAngle.Text = AngleHolder 'menampilkan derajat sudut Angle = AngleHolder perhitungan sudut Redraw derajat sudut Private Sub BUTNQuit_Click() sumbux.hide 'akhir program MDIForm1.Show Private Sub BUTNReset_Click() 'mengatur 'refresh tampilan Timer1.Interval = Timer1.Interval / 2 Private Sub Form_Load() Angle = 0 sudut 'Form1.ScaleMode = vbtwips AngleHolder = 355 'menginisialisasi Center.X = Pic3D.width / 2 'mengatur pusat (semua koordinat untuk picboxes harus sama Center.Y = Pic3D.height / 2 'di picboxes untuk bekerja) (yaitu dimensi X di kiri Center.Z = Pic3D.width / 2 'untuk picbox yang tepat harus sama dimensi X di atas ke bawah picbox) AngleHolder = 355 sudut menjadi 0 'atur ulang Center.X = Pic3Dkubus.width / 2 'mengatur pusat (semua koordinat untuk picboxes harus sama
82 Center.Y = Pic3Dkubus.height / 2 'di picboxes untuk bekerja) (yaitu dimensi X di kiri Center.Z = Pic3Dkubus.width / 2 'untuk picbox yang tepat harus sama dimensi X di atas ke bawah picbox) 'menetapkan poin untuk persegi panjang (bisa dilakukan dalam satu lingkaran cara yang lebih baik dll) 'Juga bentuknya tidak harus persegi panjang bisa bentuk apapun 'Balok 'depan Sides(0).Points(0).X = -40: Sides(0).Points(0).Y = -80: Sides(0).Points(0).Z = 40 Sides(0).Points(1).X = 80: Sides(0).Points(1).Y = -80: Sides(0).Points(1).Z = 40 Sides(0).Points(2).X = 80: Sides(0).Points(2).Y = 80: Sides(0).Points(2).Z = 40 Sides(0).Points(3).X = -40: Sides(0).Points(3).Y = 80: Sides(0).Points(3).Z = 40 'belakang Sides(1).Points(0).X = 80: Sides(1).Points(0).Y = -80: Sides(1).Points(0).Z = -40 Sides(1).Points(1).X = -40: Sides(1).Points(1).Y = -80: Sides(1).Points(1).Z = -40 Sides(1).Points(2).X = -40: Sides(1).Points(2).Y = 80: Sides(1).Points(2).Z = -40 Sides(1).Points(3).X = 80: Sides(1).Points(3).Y = 80: Sides(1).Points(3).Z = -40 'atas Sides(2).Points(0).X = -40: Sides(2).Points(0).Y = -80: Sides(2).Points(0).Z = -40 Sides(2).Points(1).X = 80: Sides(2).Points(1).Y = -80: Sides(2).Points(1).Z = -40 Sides(2).Points(2).X = 80: Sides(2).Points(2).Y = -80: Sides(2).Points(2).Z = 40 Sides(2).Points(3).X = -40: Sides(2).Points(3).Y = -80: Sides(2).Points(3).Z = 40 'bawah Sides(3).Points(0).X = -40: Sides(3).Points(0).Y = 80: Sides(3).Points(0).Z = 40 Sides(3).Points(1).X = 80: Sides(3).Points(1).Y = 80: Sides(3).Points(1).Z = 40 Sides(3).Points(2).X = 80: Sides(3).Points(2).Y = 80: Sides(3).Points(2).Z = -40 Sides(3).Points(3).X = -40: Sides(3).Points(3).Y = 80: Sides(3).Points(3).Z = -40 'kiri Sides(4).Points(0).X = -40: Sides(4).Points(0).Y = -80: Sides(4).Points(0).Z = -40 Sides(4).Points(1).X = -40: Sides(4).Points(1).Y = -80: Sides(4).Points(1).Z = 40
83 Sides(4).Points(2).X = -40: Sides(4).Points(2).Y = 80: Sides(4).Points(2).Z = 40 Sides(4).Points(3).X = -40: Sides(4).Points(3).Y = 80: Sides(4).Points(3).Z = -40 'kanan Sides(5).Points(0).X = 80: Sides(5).Points(0).Y = -80: Sides(5).Points(0).Z = 40 Sides(5).Points(1).X = 80: Sides(5).Points(1).Y = -80: Sides(5).Points(1).Z = -40 Sides(5).Points(2).X = 80: Sides(5).Points(2).Y = 80: Sides(5).Points(2).Z = -40 Sides(5).Points(3).X = 80: Sides(5).Points(3).Y = 80: Sides(5).Points(3).Z = 40 'kubus 'depan Sides1(0).Points(0).X = -40: Sides1(0).Points(0).Y = -40: Sides1(0).Points(0).Z = 40 Sides1(0).Points(1).X = 40: Sides1(0).Points(1).Y = -40: Sides1(0).Points(1).Z = 40 Sides1(0).Points(2).X = 40: Sides1(0).Points(2).Y = 40: Sides1(0).Points(2).Z = 40 Sides1(0).Points(3).X = -40: Sides1(0).Points(3).Y = 40: Sides1(0).Points(3).Z = 40 'belakang Sides1(1).Points(0).X = 40: Sides1(1).Points(0).Y = -40: Sides1(1).Points(0).Z = -40 Sides1(1).Points(1).X = -40: Sides1(1).Points(1).Y = -40: Sides1(1).Points(1).Z = -40 Sides1(1).Points(2).X = -40: Sides1(1).Points(2).Y = 40: Sides1(1).Points(2).Z = -40 Sides1(1).Points(3).X = 40: Sides1(1).Points(3).Y = 40: Sides1(1).Points(3).Z = -40 'atas Sides1(2).Points(0).X = -40: Sides1(2).Points(0).Y = -40: Sides1(2).Points(0).Z = -40 Sides1(2).Points(1).X = 40: Sides1(2).Points(1).Y = -40: Sides1(2).Points(1).Z = -40 Sides1(2).Points(2).X = 40: Sides1(2).Points(2).Y = -40: Sides1(2).Points(2).Z = 40 Sides1(2).Points(3).X = -40: Sides1(2).Points(3).Y = -40: Sides1(2).Points(3).Z = 40 'bawah Sides1(3).Points(0).X = -40: Sides1(3).Points(0).Y = 40: Sides1(3).Points(0).Z = 40 Sides1(3).Points(1).X = 40: Sides1(3).Points(1).Y = 40: Sides1(3).Points(1).Z = 40 Sides1(3).Points(2).X = 40: Sides1(3).Points(2).Y = 40: Sides1(3).Points(2).Z = -40
84 Sides1(3).Points(3).X = -40: Sides1(3).Points(3).Y = 40: Sides1(3).Points(3).Z = -40 'kiri Sides1(4).Points(0).X = -40: Sides1(4).Points(0).Y = -40: Sides1(4).Points(0).Z = -40 Sides1(4).Points(1).X = -40: Sides1(4).Points(1).Y = -40: Sides1(4).Points(1).Z = 40 Sides1(4).Points(2).X = -40: Sides1(4).Points(2).Y = 40: Sides1(4).Points(2).Z = 40 Sides1(4).Points(3).X = -40: Sides1(4).Points(3).Y = 40: Sides1(4).Points(3).Z = -40 'kanan Sides1(5).Points(0).X = 40: Sides1(5).Points(0).Y = -40: Sides1(5).Points(0).Z = 40 Sides1(5).Points(1).X = 40: Sides1(5).Points(1).Y = -40: Sides1(5).Points(1).Z = -40 Sides1(5).Points(2).X = 40: Sides1(5).Points(2).Y = 40: Sides1(5).Points(2).Z = -40 Sides1(5).Points(3).X = 40: Sides1(5).Points(3).Y = 40: Sides1(5).Points(3).Z = 40 'mengatur jumlah tepi untuk setiap sisi For I = 0 To 5 Sides(I).NumPoints = 3 For I = 0 To 5 Sides1(I).NumPoints = 3 'mengatur jumlah sisi pada objek NumObjectSides = 5 'menghitung dengan normal FindNormals 'membuat fungsi Lookup table untuk Cos dan Sin 'Metode ini jauh lebih cepat daripada menghitung setiap langkah CreateTables 'atur sudut dan menampilkan bentuk BUTNOKAY_Click Sub Redraw() 'bersihkan picboxes Pic3D.Cls Pic3Dkubus.Cls 'menggambar depan kotak dalam tampilan stasioner 'ulangi lingkaran 6 kali sekali untuk setiap sisi rotasi setiap titik harus 'dihitung untuk menemukan posisi normal masing-masing pihak 'untuk menentukan apakah itu terlihat For j = 0 To 5 '************************************* ************************* 'menggambar poin untuk atas ke bawah rotasi (rotasi di sekitar sumbu X)
85 '************************************* ************************* For I = 0 To Sides(0).NumPoints XSides(j).NumPoints = Sides(0).NumPoints XSides(j).Points(I).X = Sides(j).Points(I).X 'nilai x XSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).Z * SinAng(Angle) 'nilai y XSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai z XSides(j).Normal.X = Sides(j).Normal.X XSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.Z * SinAng(Angle) 'nilai y XSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints XSides1(j).NumPoints = Sides1(0).NumPoints XSides1(j).Points(I).X = Sides1(j).Points(I).X 'nilai x XSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).Z * SinAng(Angle) 'nilai y XSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai z XSides1(j).Normal.X = Sides1(j).Normal.X XSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.Z * SinAng(Angle) 'nilai y XSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai z If VisiblePlane(XSides(j), 0, 0, 1000) Then 'Buat garis di atas, rotasi atas ke bawah DrawShape XSides(j), Pic3D, "FRONT" If VisiblePlane(XSides1(j), 0, 0, 1000) Then 'Buat garis di atas, rotasi atas ke bawah DrawShape XSides1(j), Pic3Dkubus, "FRONT" '************************************* *********************** 'menggambar poin untuk rotasi kiri ke kanan (rotasi di sekitar sumbu Y)
86 '************************************* ************************* For I = 0 To Sides(0).NumPoints YSides(j).NumPoints = Sides(0).NumPoints YSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Z * SinAng(Angle) 'nilai x YSides(j).Points(I).Y = Sides(j).Points(I).Y 'nilai y YSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai z YSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Z * SinAng(Angle) 'nilai x YSides(j).Normal.Y = Sides(j).Normal.Y 'nilai y YSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints YSides1(j).NumPoints = Sides1(0).NumPoints YSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Z * SinAng(Angle) 'nilai x YSides1(j).Points(I).Y = Sides1(j).Points(I).Y 'nilai y YSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai z YSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Z * SinAng(Angle) 'nilai x YSides1(j).Normal.Y = Sides1(j).Normal.Y 'nilai y YSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai z 'Menggambar garis di kanan atas untuk melihat rotasi kiri '************************************* ************************* 'menggambar poin untuk rotasi menyamping (rotasi di sekitar sumbu Z) '************************************* ************************* 'Hapus komentar untuk melakukan perhitungan 'putar arah Z 'Rotate Z direction For I = 0 To Sides(0).NumPoints
87 ZSides(j).NumPoints = Sides(0).NumPoints ZSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai y ZSides(j).Points(I).Z = Sides(j).Points(I).Z 'nilai z ZSides1(j).Points(I).Z = Sides1(j).Points(I).Z 'nilai z ZSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai x ZSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai y ZSides1(j).Normal.Z = Sides1(j).Normal.Z 'nilai z ZSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai x ZSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai y ZSides(j).Normal.Z = Sides(j).Normal.Z 'nilai z For I = 0 To Sides1(0).NumPoints ZSides1(j).NumPoints = Sides1(0).NumPoints ZSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai y 'Putar diputar ke arah nilai-nilai X ke arah Z untuk membuat "efek berputar" For I = 0 To Sides(0).NumPoints Sides3D(j).NumPoints = Sides(0).NumPoints Sides3D(j).Points(I).X = XSides(j).Points(I).X * CosAng(Angle) + XSides(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D(j).Points(I).Y = XSides(j).Points(I).Y * CosAng(Angle) - XSides(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D(j).Points(I).Z = XSides(j).Points(I).Z 'nilai z Sides3D(j).Normal.X = XSides(j).Normal.X * CosAng(Angle) +
88 XSides(j).Normal.Y * SinAng(Angle) 'nilai x Sides3D(j).Normal.Y = XSides(j).Normal.Y * CosAng(Angle) - XSides(j).Normal.X * SinAng(Angle) 'nilai y Sides3D(j).Normal.Z = XSides(j).Normal.Z 'nilai z For I = 0 To Sides1(0).NumPoints Sides3D1(j).NumPoints = Sides1(0).NumPoints Sides3D1(j).Points(I).X = XSides1(j).Points(I).X * CosAng(Angle) + XSides1(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D1(j).Points(I).Y = XSides1(j).Points(I).Y * CosAng(Angle) - XSides1(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D1(j).Points(I).Z = XSides1(j).Points(I).Z 'nilai z j 'membentuk titik pusat picbox berwarna biru Pic3D.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Pic3Dkubus.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Private Sub intervalrotasi_click() Dim temp As String temp = InputBox("Masukkan Interval Rotasi (ms):", "Interval rotasi", Timer1.Interval) If Trim$(temp) <> "" Then Timer1.Enabled = True Timer1.Interval = temp Private Sub lambat_click() Timer1.Enabled = True Timer1.Interval = Timer1.Interval * 2 Sides3D1(j).Normal.X = XSides1(j).Normal.X * CosAng(Angle) + XSides1(j).Normal.Y * SinAng(Angle) 'nilai x Sides3D1(j).Normal.Y = XSides1(j).Normal.Y * CosAng(Angle) - XSides1(j).Normal.X * SinAng(Angle) 'nilai y Sides3D1(j).Normal.Z = XSides1(j).Normal.Z 'nilai z i Private Sub sudutrotasi_click() Dim temp As String temp = InputBox("masukkan sudut rotasi(derajat):", "Sudut Rotasi") If Trim$(temp) <> "" Then
89 AngleHolder = AngleHolder + temp 'menaikkan derajat sudut ReDim tmp(shape.numpoints) As POINTAPI If AngleHolder = 360 Then sudut kembali ke 0 AngleHolder = 0 'atur 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 If AngleHolder > 360 Then kembali ke 0 MsgBox "batas rotasi sudut sampai 360,dan sudut akan kembali ke 0", vbinformation AngleHolder = 0 TEXTAngle.Text = AngleHolder 'menampilkan derajat sudut Angle = AngleHolder perhitungan sudut Redraw Private Sub Timer1_Timer() 'memutar persegi panjang BUTNOKAY_Click 'atur sudut 'atur Private Function DrawShape(shape As Verticies, PicBox As PictureBox, View As String) tmp(i).y = shape.points(i).y + 120 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) / 2) Colr = 100 + 200 * (shape.normal.z) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "TOP" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI If View = "FRONT" Then 'membentuk lppoints untuk memanggil fungsi win api 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll
90 For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 tmp(i).y = shape.points(i).z + 120 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) / 2) Colr = 100 + 200 * (shape.normal.y) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "SIDE" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).z + 120 tmp(i).y = shape.points(i).y + 120 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) / 2) Colr = 100 + 200 * (shape.normal.x) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 End Function Private Function VisiblePlane(shape As Verticies, CameraX As Integer, CameraY As Integer, CameraZ As Integer) 'mencari dot product D = (shape.normal.x * CameraX) + (shape.normal.y * CameraY) + (shape.normal.z * CameraZ) 'return true jika objek ada VisiblePlane = D >= 0 End Function Private Function FindNormals() For I = 0 To NumObjectSides With Sides(I)
91 Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) - (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) - (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length End With 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^ End Function.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length End With For I = 0 To NumObjectSides With Sides1(I) Private Function CreateTables() 'membentuk lookup table cosine dan sine For I = 0 To 359 CosAng(I) = Cos(I * (3.14159265358979 / 180)) 'konversi ke derajat SinAng(I) = Sin(I * (3.14159265358979 / 180)) 'konversi ke derajat Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) End Function Listing Program sumbuy (sumbuy.frm) Sub Redraw() 'bersihkan picboxes
92 Pic3D.Cls Pic3Dkubus.Cls 'menggambar depan kotak dalam tampilan stasioner 'ulangi lingkaran 6 kali sekali untuk setiap sisi rotasi setiap titik harus 'dihitung untuk menemukan posisi normal masing-masing pihak 'untuk menentukan apakah itu terlihat For j = 0 To 5 '************************************* ************************* 'menggambar poin untuk atas ke bawah rotasi (rotasi di sekitar sumbu X) '************************************* ************************* For I = 0 To Sides(0).NumPoints XSides(j).NumPoints = Sides(0).NumPoints XSides(j).Points(I).X = Sides(j).Points(I).X 'nilai x XSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).Z * SinAng(Angle) 'nilai y XSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai z XSides(j).Normal.X = Sides(j).Normal.X XSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.Z * SinAng(Angle) 'nilai x XSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints XSides1(j).NumPoints = Sides1(0).NumPoints XSides1(j).Points(I).X = Sides1(j).Points(I).X 'nilai x XSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).Z * SinAng(Angle) 'nilai y XSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai z XSides1(j).Normal.X = Sides1(j).Normal.X XSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.Z * SinAng(Angle) 'nilai y XSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai z
93 '************************************* ************************* 'menggambar poin untuk kiri ke kanan rotasi (rotasi di sekitar sumbu Y) '************************************* ************************* For I = 0 To Sides(0).NumPoints YSides(j).NumPoints = Sides(0).NumPoints YSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Z * SinAng(Angle) 'nilai x YSides(j).Points(I).Y = Sides(j).Points(I).Y 'nilai y YSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai z YSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Z * SinAng(Angle) 'nilai x YSides(j).Normal.Y = Sides(j).Normal.Y 'nilai y YSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints YSides1(j).NumPoints = Sides1(0).NumPoints YSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Z * SinAng(Angle) 'nilai x YSides1(j).Points(I).Y = Sides1(j).Points(I).Y 'nilai y YSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai z YSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Z * SinAng(Angle) 'nilai x YSides1(j).Normal.Y = Sides1(j).Normal.Y 'nilai y YSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai z If VisiblePlane(YSides(j), 0, 0, 1000) Then 'Buat garis di kanan depan untuk melihat rotasi kiri DrawShape YSides(j), Pic3D, "FRONT" If VisiblePlane(YSides1(j), 0, 0, 1000) Then 'Buat garis di kanan depan untuk melihat rotasi kiri DrawShape YSides1(j), Pic3Dkubus, "FRONT"
94 '************************************* ************************* 'menggambar poin untuk rotasi menyamping (rotasi di sekitar sumbu Z) For I = 0 To Sides1(0).NumPoints ZSides1(j).NumPoints = Sides1(0).NumPoints '************************************* ************************* 'Hapus komentar untuk melakukan perhitungan 'Putar arah Z For I = 0 To Sides(0).NumPoints ZSides(j).NumPoints = Sides(0).NumPoints ZSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai y ZSides(j).Points(I).Z = Sides(j).Points(I).Z 'nilai z ZSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai x ZSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai y ZSides(j).Normal.Z = Sides(j).Normal.Z 'nilai z ZSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai y ZSides1(j).Points(I).Z = Sides1(j).Points(I).Z 'nilai z ZSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai x ZSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai y ZSides1(j).Normal.Z = Sides1(j).Normal.Z 'nilai z 'Putar diputar ke arah nilai-nilai X ke arah Z untuk membuat "efek berputar" For I = 0 To Sides(0).NumPoints Sides3D(j).NumPoints = Sides(0).NumPoints Sides3D(j).Points(I).X = XSides(j).Points(I).X * CosAng(Angle) +
95 XSides(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D(j).Points(I).Y = XSides(j).Points(I).Y * CosAng(Angle) - XSides(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D(j).Points(I).Z = XSides(j).Points(I).Z 'nilai z Sides3D(j).Normal.X = XSides(j).Normal.X * CosAng(Angle) + XSides(j).Normal.Y * SinAng(Angle) 'nilai x Sides3D(j).Normal.Y = XSides(j).Normal.Y * CosAng(Angle) - XSides(j).Normal.X * SinAng(Angle) 'nilai y Sides3D(j).Normal.Z = XSides(j).Normal.Z 'nilai z For I = 0 To Sides1(0).NumPoints Sides3D1(j).NumPoints = Sides1(0).NumPoints Sides3D1(j).Points(I).X = XSides1(j).Points(I).X * CosAng(Angle) + XSides1(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D1(j).Points(I).Y = XSides1(j).Points(I).Y * CosAng(Angle) - XSides1(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D1(j).Points(I).Z = XSides1(j).Points(I).Z 'nilai z Sides3D1(j).Normal.X = XSides1(j).Normal.X * CosAng(Angle) + XSides1(j).Normal.Y * SinAng(Angle) 'nilai x Sides3D1(j).Normal.Y = XSides1(j).Normal.Y * CosAng(Angle) - XSides1(j).Normal.X * SinAng(Angle) 'nilai y Sides3D1(j).Normal.Z = XSides1(j).Normal.Z 'nilai z j Pic3D.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Pic3Dkubus.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Private Sub intervalrotasi_click() Dim temp As String temp = InputBox("Masukkan Interval Rotasi (ms):", "Interval rotasi", Timer1.Interval) If Trim$(temp) <> "" Then Timer1.Enabled = True Timer1.Interval = temp Private Sub lambat_click() Timer1.Enabled = True Timer1.Interval = Timer1.Interval * 2 Private Sub sudutrotasi_click() Dim temp As String
96 temp = InputBox("masukkan sudut rotasi(derajat):", "Sudut Rotasi") 'input interval rotasi If Trim$(temp) <> "" Then AngleHolder = AngleHolder + temp 'menaikkan sudut 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll If AngleHolder = 360 Then sudut kembali ke 0 AngleHolder = 0 If AngleHolder > 360 Then kembali ke 0 'atur 'atur sudut For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 tmp(i).y = shape.points(i).y + 120 'membentuk solid polygon MsgBox "batas rotasi sudut sampai 360,dan sudut akan kembali ke 0", vbinformation AngleHolder = 0 TEXTAngle.Text = AngleHolder 'menampilkan sudut Angle = AngleHolder perhitungan sudut Redraw Private Sub Timer1_Timer() 'memutar persegi panjang BUTNOKAY_Click 'atur Private Function DrawShape(shape As Verticies, PicBox As PictureBox, View As String) If View = "FRONT" Then 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) / 2) Colr = 100 + 200 * (shape.normal.z) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "TOP" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI
97 tmp(i).y = shape.points(i).y + 120 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 tmp(i).y = shape.points(i).z + 120 'membentuk solid polygon 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) Colr = 100 + 200 * (shape.normal.x) 'membuat objek solid PicBox.FillStyle = 0 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) Colr = 100 + 200 * (shape.normal.y) 'membuat objek solid / 2) 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon / 2) PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "SIDE" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll End Function Private Function VisiblePlane(shape As Verticies, CameraX As Integer, CameraY As Integer, CameraZ As Integer) 'mencari dot product D = (shape.normal.x * CameraX) + (shape.normal.y * CameraY) + (shape.normal.z * CameraZ) 'return true jika objek ada VisiblePlane = D >= 0 End Function For I = 0 To shape.numpoints tmp(i).x = shape.points(i).z + 120 Private Function FindNormals()
98 For I = 0 To NumObjectSides With Sides(I) Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) - (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length End With For I = 0 To NumObjectSides With Sides1(I) Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) - (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) End With End Function Private Function CreateTables() 'membentuk lookup table cosine dan sine For I = 0 To 359 CosAng(I) = Cos(I * (3.14159265358979 / 180)) 'konversi ke derajat SinAng(I) = Sin(I * (3.14159265358979 / 180)) 'konversi ke derajat End Function Listing Program sumbuz (sumbuz.frm) Sub Redraw() 'bersihkan picboxes Pic3D.Cls Pic3Dkubus.Cls 'menggambar depan kotak dalam tampilan stasioner 'ulangi lingkaran 6 kali sekali untuk setiap sisi rotasi setiap titik harus 'dihitung untuk menemukan posisi normal masing-masing pihak
99 'untuk menentukan apakah itu terlihat For j = 0 To 5 '************************************* ************************* 'menggambar poin untuk atas ke bawah rotasi (rotasi di sekitar sumbu X) '************************************* ************************* For I = 0 To Sides(0).NumPoints XSides(j).NumPoints = Sides(0).NumPoints XSides(j).Points(I).X = Sides(j).Points(I).X 'nilai x XSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).Z * SinAng(Angle) 'nilai y XSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai z XSides(j).Normal.X = Sides(j).Normal.X XSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.Z * SinAng(Angle) 'nilai y XSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints XSides1(j).NumPoints = Sides1(0).NumPoints XSides1(j).Points(I).X = Sides1(j).Points(I).X 'nilai x XSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).Z * SinAng(Angle) 'nilai y XSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai z XSides1(j).Normal.X = Sides1(j).Normal.X XSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.Z * SinAng(Angle) 'nilai y XSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai z '************************************* ************************* 'menggambar poin untuk kiri ke kanan rotasi (rotasi di sekitar sumbu Y) '************************************* ************************* For I = 0 To Sides(0).NumPoints YSides(j).NumPoints = Sides(0).NumPoints YSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Z * SinAng(Angle) 'nilai x
100 YSides(j).Points(I).Y = Sides(j).Points(I).Y 'nilai y YSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai z YSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Z * SinAng(Angle) 'nilai x YSides(j).Normal.Y = Sides(j).Normal.Y 'nilai y YSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints YSides1(j).NumPoints = Sides1(0).NumPoints YSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Z * SinAng(Angle) 'nilai x YSides1(j).Points(I).Y = Sides1(j).Points(I).Y 'nilai y YSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai z YSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Z * SinAng(Angle) 'nilai x YSides1(j).Normal.Y = Sides1(j).Normal.Y 'nilai y YSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai z If VisiblePlane(XSides(j), 1000, 0, 0) Then 'Draw points in side, top to bottom rotation view DrawShape XSides(j), Pic3D, "SIDE" If VisiblePlane(XSides1(j), 1000, 0, 0) Then 'Draw points in side, top to bottom rotation view DrawShape XSides1(j), Pic3Dkubus, "SIDE" 'Menggambar garis di kanan atas untuk melihat rotasi kiri '************************************* ************************* 'menggambar poin untuk rotasi menyamping (rotasi di sekitar sumbu Z) '************************************* ************************* 'Hapus komentar untuk melakukan perhitungan 'putar arah Z
101 For I = 0 To Sides(0).NumPoints ZSides(j).NumPoints = Sides(0).NumPoints ZSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai y ZSides(j).Points(I).Z = Sides(j).Points(I).Z 'nilai z ZSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai x ZSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai y ZSides(j).Normal.Z = Sides(j).Normal.Z 'nilai z For I = 0 To Sides1(0).NumPoints ZSides1(j).NumPoints = Sides1(0).NumPoints ZSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai y ZSides1(j).Points(I).Z = Sides1(j).Points(I).Z 'nilai z ZSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai x ZSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai y ZSides1(j).Normal.Z = Sides1(j).Normal.Z 'nilai z 'Putar diputar ke arah nilai-nilai X ke arah Z untuk membuat "efek berputar" For I = 0 To Sides(0).NumPoints Sides3D(j).NumPoints = Sides(0).NumPoints Sides3D(j).Points(I).X = XSides(j).Points(I).X * CosAng(Angle) + XSides(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D(j).Points(I).Y = XSides(j).Points(I).Y * CosAng(Angle) - XSides(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D(j).Points(I).Z = XSides(j).Points(I).Z 'nilai z Sides3D(j).Normal.X = XSides(j).Normal.X * CosAng(Angle) + XSides(j).Normal.Y * SinAng(Angle) 'nilai x
102 Sides3D(j).Normal.Y = XSides(j).Normal.Y * CosAng(Angle) - XSides(j).Normal.X * SinAng(Angle) 'nilai y Sides3D(j).Normal.Z = XSides(j).Normal.Z 'nilai z For I = 0 To Sides1(0).NumPoints Sides3D1(j).NumPoints = Sides1(0).NumPoints Sides3D1(j).Points(I).X = XSides1(j).Points(I).X * CosAng(Angle) + XSides1(j).Points(I).Y * SinAng(Angle) 'nilai x Sides3D1(j).Points(I).Y = XSides1(j).Points(I).Y * CosAng(Angle) - XSides1(j).Points(I).X * SinAng(Angle) 'nilai y Sides3D1(j).Points(I).Z = XSides1(j).Points(I).Z 'nilai z Sides3D1(j).Normal.X = XSides1(j).Normal.X * CosAng(Angle) + XSides1(j).Normal.Y * SinAng(Angle) 'nilai x Sides3D1(j).Normal.Y = XSides1(j).Normal.Y * CosAng(Angle) - XSides1(j).Normal.X * SinAng(Angle) 'nilai y Sides3D1(j).Normal.Z = XSides1(j).Normal.Z 'nilai z j 'membentuk titik pusat picbox berwarna biru Pic3D.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Pic3Dkubus.Circle (Center.X, Center.Y), 40, RGB(0, 0, 255) Private Sub intervalrotasi_click() Dim temp As String temp = InputBox("Masukkan Interval Rotasi (ms):", "Interval rotasi", Timer1.Interval) If Trim$(temp) <> "" Then Timer1.Enabled = True Timer1.Interval = temp Private Sub lambat_click() Timer1.Enabled = True Timer1.Interval = Timer1.Interval * 2 Private Sub sudutrotasi_click() Dim temp As String temp = InputBox("masukkan sudut rotasi(derajat):", "Sudut Rotasi") If Trim$(temp) <> "" Then AngleHolder = AngleHolder + temp 'menaikkan derajat sudut If AngleHolder = 360 Then sudut kembali ke 0 AngleHolder = 0 'aturulang
103 If AngleHolder > 360 Then sudut kembali ke 0 MsgBox "batas rotasi sudut sampai 360,dan sudut akan kembali ke 0", vbinformation AngleHolder = 0 TEXTAngle.Text = AngleHolder 'menampilkan derajat sudut Angle = AngleHolder perhitungan sudut Redraw Private Sub Timer1_Timer() 'memutar persegi panjang BUTNOKAY_Click 'aturulang 'atur Private Function DrawShape(shape As Verticies, PicBox As PictureBox, View As String) 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) / 2) Colr = 100 + 200 * (shape.normal.z) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "TOP" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI If View = "FRONT" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 tmp(i).y = shape.points(i).y + 120 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).x + 120 tmp(i).y = shape.points(i).z + 120 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position)
104 / 2) Colr = 100 + 200 * (shape.normal.y) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 ElseIf View = "SIDE" Then 'membentuk lppoints untuk memanggil fungsi win api ReDim tmp(shape.numpoints) As POINTAPI 'mengisi tmp.x menggambar poin sebagai nilai yang terjadi di x dir dll For I = 0 To shape.numpoints tmp(i).x = shape.points(i).z + 120 tmp(i).y = shape.points(i).y + 120 'membentuk solid polygon 'mengatur nilai cahaya (ambient + Max * (normal of plane * light position) Colr = 100 + 200 * (shape.normal.x) 'membuat objek solid PicBox.FillStyle = 0 'memilih warna menjadi warna kuning / 2) PicBox.FillColor = RGB(Colr, Colr, Colr 'membentuk polygon Polygon PicBox.hdc, tmp(0), shape.numpoints + 1 'membentuk objek transparan PicBox.FillStyle = 1 End Function Private Function VisiblePlane(shape As Verticies, CameraX As Integer, CameraY As Integer, CameraZ As Integer) 'mencari dot product D = (shape.normal.x * CameraX) + (shape.normal.y * CameraY) + (shape.normal.z * CameraZ) 'return true jika objek ada VisiblePlane = D >= 0 End Function Private Function FindNormals() For I = 0 To NumObjectSides With Sides(I) Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) -
105 (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) End Function 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length End With For I = 0 To NumObjectSides With Sides1(I) Private Function CreateTables() 'membentuk lookup table cosine dan sine For I = 0 To 359 CosAng(I) = Cos(I * (3.14159265358979 / 180)) 'konversi ke derajat SinAng(I) = Sin(I * (3.14159265358979 / 180)) 'konversi ke derajat End Function Nx = (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).Z -.Points(0).Z) - (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).Y -.Points(0).Y) Ny = (.Points(1).Z -.Points(0).Z) * (.Points(.NumPoints).X -.Points(0).X) - (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Z -.Points(0).Z) Nz = (.Points(1).X -.Points(0).X) * (.Points(.NumPoints).Y -.Points(0).Y) - (.Points(1).Y -.Points(0).Y) * (.Points(.NumPoints).X -.Points(0).X) 2) Length = Sqr(Nx ^ 2 + Ny ^ 2 + Nz ^.Normal.X = Nx / Length.Normal.Y = Ny / Length.Normal.Z = Nz / Length End With LISTING PROGRAM Sumbuxyz(sumbuxyz.frm) Sub Redraw() 'bersihkan picboxes Pic3D.Cls Pic3Dkubus.Cls 'menggambar depan kotak dalam tampilan stasioner 'ulangi lingkaran 6 kali sekali untuk setiap sisi rotasi setiap titik harus 'dihitung untuk menemukan posisi normal masing-masing pihak 'untuk menentukan apakah itu terlihat For j = 0 To 5 '************************************* *************************
106 'menggambar poin untuk atas ke bawah rotasi (rotasi di sekitar sumbu X) '************************************* ************************* For I = 0 To Sides(0).NumPoints XSides(j).NumPoints = Sides(0).NumPoints XSides(j).Points(I).X = Sides(j).Points(I).X 'nilai x XSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).Z * SinAng(Angle) 'nilai y XSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai z XSides(j).Normal.X = Sides(j).Normal.X XSides(j).Normal.Y = Sides(j).Normal.Y * CosAng(Angle) - Sides(j).Normal.Z * SinAng(Angle) 'nilai y XSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints XSides1(j).NumPoints = Sides1(0).NumPoints XSides1(j).Points(I).X = Sides1(j).Points(I).X 'nilai x XSides1(j).Points(I).Y = Sides1(j).Points(I).Y * CosAng(Angle) - Sides1(j).Points(I).Z * SinAng(Angle) 'nilai y XSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) + Sides1(j).Points(I).Y * SinAng(Angle) 'nilai z XSides1(j).Normal.X = Sides1(j).Normal.X XSides1(j).Normal.Y = Sides1(j).Normal.Y * CosAng(Angle) - Sides1(j).Normal.Z * SinAng(Angle) 'nilai y XSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) + Sides1(j).Normal.Y * SinAng(Angle) 'nilai z 'periksa untuk melihat apakah pesawat terlihat jika demikian menarik itu '************************************* ************************* 'menggambar poin untuk kiri ke kanan rotasi (rotasi di sekitar sumbu Y) '************************************* ************************* For I = 0 To Sides(0).NumPoints YSides(j).NumPoints = Sides(0).NumPoints YSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Z * SinAng(Angle) 'nilai x YSides(j).Points(I).Y = Sides(j).Points(I).Y 'nilai y
107 YSides(j).Points(I).Z = Sides(j).Points(I).Z * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai z YSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Z * SinAng(Angle) 'nilai x YSides(j).Normal.Y = Sides(j).Normal.Y 'nilai y YSides(j).Normal.Z = Sides(j).Normal.Z * CosAng(Angle) - Sides(j).Normal.X * SinAng(Angle) 'nilai z For I = 0 To Sides1(0).NumPoints YSides1(j).NumPoints = Sides1(0).NumPoints YSides1(j).Points(I).X = Sides1(j).Points(I).X * CosAng(Angle) + Sides1(j).Points(I).Z * SinAng(Angle) 'nilai x YSides1(j).Points(I).Y = Sides1(j).Points(I).Y 'nilai y YSides1(j).Points(I).Z = Sides1(j).Points(I).Z * CosAng(Angle) - Sides1(j).Points(I).X * SinAng(Angle) 'nilai z YSides1(j).Normal.X = Sides1(j).Normal.X * CosAng(Angle) + Sides1(j).Normal.Z * SinAng(Angle) 'nilai x YSides1(j).Normal.Y = Sides1(j).Normal.Y 'nilai y YSides1(j).Normal.Z = Sides1(j).Normal.Z * CosAng(Angle) - Sides1(j).Normal.X * SinAng(Angle) 'nilai z 'periksa untuk melihat apakah pesawat terlihat jika demikian menarik itu 'Menggambar garis di kanan atas untuk melihat rotasi kiri '************************************* ************************* 'menggambar poin untuk rotasi menyamping (rotasi di sekitar sumbu Z) '************************************* ************************* 'Hapus komentar untuk melakukan perhitungan 'putar arah Z For I = 0 To Sides(0).NumPoints ZSides(j).NumPoints = Sides(0).NumPoints ZSides(j).Points(I).X = Sides(j).Points(I).X * CosAng(Angle) + Sides(j).Points(I).Y * SinAng(Angle) 'nilai x ZSides(j).Points(I).Y = Sides(j).Points(I).Y * CosAng(Angle) - Sides(j).Points(I).X * SinAng(Angle) 'nilai y ZSides(j).Points(I).Z = Sides(j).Points(I).Z 'nilai z ZSides(j).Normal.X = Sides(j).Normal.X * CosAng(Angle) + Sides(j).Normal.Y * SinAng(Angle) 'nilai x