• Tidak ada hasil yang ditemukan

JILID 1

N/A
N/A
Protected

Academic year: 2022

Membagikan "JILID 1"

Copied!
324
0
0

Teks penuh

(1)

JILID 1

(2)

2009.

Bio Data Penulis

Penulis lahir di Semarang pada tanggal 1 Maret 1983.

Penulis menempuh pendidikan Sarjana Teknik Elektro di Universitas Kristen Satya Wacana (UKSW), lulus tahun 2004, kemudian tahun 2005 melanjutkan studi pada Magister Desain pada Fakultas Seni Rupa dan Desain, Institut Teknologi Bandung (ITB), dan melanjutkan studi pada program studi Teknologi Multimedia pada Swinburne University of Technology Australia .

Penulis sejak tahun 2010, menjadi dosen pada program studi Desain Grafis Universitas Sains dan Teknologi Komputer (Universitas STEKOM), memiliki jabatan fungsional Lektor 300 dan sedang proses mengajukan kenaikan jabatan fungsional menjadi Lektor Kepala. Penulis juga seorang wirausaha di bidang toko online yang berhasil di kota Semarang dan juga aktif sebagai freelancer dalam bidang fotografi, web design dan multimedia.

JILID 1

YAYASAN PRIMA AGUS TEKNIK Jl. Majapahit No. 605 Semarang Telp. (024) 6723456. Fax. 024-6710144

PENERBIT :

P

Y

(3)

YAYASAN PRIMA AGUS TEKNIK Jl. Majapahit No. 605 Semarang Telp. (024) 6723456. Fax. 024-6710144 Email : [email protected] PENERBIT :

JILID 1

(4)

Dr. Joseph Teguh Santoso, S.Kom., M.Kom.

Dr. Mars Caroline Wibowo. S.T., M.Mm.Tech

Universitas STEKOM

Bekerja sama dengan

Universitas Sains & Teknologi Komputer (Universitas STEKOM) Dr. Mars Caroline Wibowo. S.T., M.Mm.Tech

, S.Ds., M.Kom

(5)

iii

Puji syukur kami panjatkan atas kehadirat Tuhan karena buku yang berjudul “Dasar Desain Grafis: Jilid 1” dapat terselesaikan. Grafis komputer adalah bidang yang berkembang pesat, sehingga spesifikasi pengetahuan itu adalah target yang bergerak. Oleh karena itu, dalam buku ini penulis melakukan yang terbaik untuk menghindari ketergantungan pada perangkat keras atau API tertentu. Pembaca didorong untuk melengkapi teks dengan dokumentasi yang relevan untuk perangkat lunak dan lingkungan perangkat keras mereka.

Untungnya, budaya grafis komputer memiliki terminologi dan konsep standar yang cukup sehingga pembahasan dalam buku ini dapat dipetakan dengan baik ke sebagian besar lingkungan.

Buku ini dibagi menjadi 2 Jilid. Jilid 1 terdiri dari 13 Bab, Bab Pertama buku jilid 1 ini memberikan definisi beberapa terminologi dasar dan memberikan beberapa latar belakang sejarah, serta sumber informasi yang berkaitan dengan komputer grafis. Bab 2 ini tidak dimaksudkan untuk membahas materi secara menyeluruh; sebaliknya intuisi dan interpretasi geometris yamh sangat ditekankan. Bab 3 Dalam bab ini, kita membahas dasar-dasar gambar dan tampilan raster, dengan memberikan perhatian khusus pada ketidaklinieran tampilan standar. Detail arti sebenarnya dari gambar. nilai piksel yang berhubungan dengan intensitas cahaya penting untuk diingat ketika kita membahas komputasi gambar di bab selanjutnya.

Bab 4 mencakup metode dasar untuk pembangkitan sinar, perpotongan sinar, dan bayangan, yang cukup untuk mengimplementasikan pelacak sinar demonstrasi sederhana.

Untuk sistem yang benar-benar berguna, teknik perpotongan sinar yang lebih efisien.

Sedangkan Bab 5 meninjau aljabar linier dasar dari perspektif geometris, dengan fokus pada intuisi dan algoritma yang bekerja dengan baik dalam kasus dua dan tiga dimensi. Bab 6 membahas mengenai transformasi geometris seperti rotasi, translasi, scalling, dan proyeksi dapat diselesaikan dengan perkalian matriks, dan matriks transformasi yang digunakan untuk melakukan ini adalah pokok bahasan bab ini. Bab 7 menjelaskan bagaimana menggunakan transformasi matriks untuk mengekspresikan pandangan paralel atau perspektif.

Transformasi dalam bab ini memproyeksikan titik 3D dalam scene (ruang dunia) ke titik 2D dalam gambar (ruang gambar), dan mereka akan memproyeksikan titik mana pun pada sinar tampilan piksel tertentu kembali ke posisi piksel tersebut dalam ruang gambar.

Bab 8 akan membahas tentang fokus pada dasar-dasar umum seperti pipeline fan rasterisasi. Dalam bab 9, dimulai dengan meringkas pengambilan sampel dan rekonstruksi menggunakan contoh konkret satu dimensi dari audio digital. Kemudian, kami akan menyajikan matematika dasar dan algoritma yang mendasari pengambilan sampel dan rekonstruksi dalam satu dan dua dimensi. Bab 10 menyajikan metode bayangan heuristik yang paling umum. Diantaranya adalah difus dan phongshading, metode lain nya adalah naungan artistik, menggunakan konvensi artistik untuk memberi warna pada objek. Bab 11 membahas penggunaan tekstur untuk merepresentasikan detail permukaan, bayangan, dan pantulan.

(6)

iv

Bab 12 berbicara tentang beberapa kategori struktur data dasar dan tidak terkait yang termasuk di antara yang paling umum dan berguna: struktur mesh, struktur data spasial, grafis scene, dan array multidimensi bersusun. Bab terakhir dalam buku jilid 1 ini membahas beberapa teknik yang lebih menarik yang dapat digunakan untuk ray-trace berbagai scene yang lebih luas dan untuk memasukkan lebih banyak variasi efek.

Buku Jilid 2 yang berjudul sama ini memiliki 13 bab yang akan membahas implementasi dan permodelan Dasar grafis komputer. Bab pertama dalam buku jilid 2 ini, akan membahas mesin untuk operasi probabilitas. Teknik-teknik ini juga akan terbukti berguna untuk mengevaluasi integral rumit secara numerik menggunakan integrasi Monte Carlo. Bab 2 membahas tentang Kurva, yang mencakup dengan permodelan geometris. Bab ke 3 akan memberikan gambaran tentang teknik dan algoritma yang langsung digunakan untuk membuat dan memanipulasi gerak. Bab 4 menjadi panduan pengantar untuk perangkat keras grafis dan dapat digunakan sebagai dasar untuk serangkaian praktik mingguan yang menyelidiki perangkat keras grafis.

Dalam bab 5 ini, membahas masalah praktis pengukuran cahaya, biasanya disebut radiometri. Bab 6 membahas tentang Warna, yaitu membahas teori dan matematika tentang koreksi warna. Bab 7 memberikan gambaran sebagian tentang apa yang diketahui tentang persepsi visual pada orang. Sedangan bab 8 membahas tentang pemilihan algoritma nada yang dapat digunakan untuk menghitung tingkat adaptasi lokal untuk fungsi kompresi sigmoidal.

Dalam bab 9 ini, membahas metode dan menjelaskan cara membangun model implisit kerangka secara lebih rinci. Bab ke 10 dalam buku ini membahas tentang globaliluminasi, seperti apakah yang dinamakan globaliluminati dan kegunaannya akan dibahas dalam bab ini.

Bab 11 membahas beberapa aspek yang paling penting secara visual dari sifat material dan beberapa model yang cukup sederhana yang berguna dalam menangkap sifat-sifat ini. Ada banyak model BRDF yang digunakan dalam grafis, dan model yang disajikan di sini dimaksudkan untuk memberikan gambaran tentang BRDF yang tidak menyebar.

Bab 12 penulis akan merinci pertimbangan khusus yang berlaku untuk grafis dalam pengembangan game, mulai dari platform tempat game dijalankan hingga proses produksi game. Bab akhir dalam buku jilid 2 ini akan menjelaskan tentang visualisasi. Visualisasi dapat digunakan untuk menghasilkan hipotesis baru ketika menjelajahi kumpulan data yang sama sekali tidak dikenal, untuk mengkonfirmasi hipotesis yang ada dalam kumpulan data yang dipahami sebagian, atau untuk menyajikan informasi tentang kumpulan data yang diketahui kepada audiens lain. Akhir kata semoga buku ini bermanfaat bagi para pembaca.

Semarang, Februari 2022 Penulis

Dr. Mars Caroline Wibowo, M.Mm.Tech.

(7)

v

Halaman Judul ... i

Daftar Isi ... iii

Kata Pengantar ... iv

BAB 1 PENDAHULUAN ... 1

1.1 Area Grafis ... 1

1.2 Aplikasi Utama ... 2

1.3 API Grafis ... 2

1.4 Saluran Grafis ... 3

1.5 Masalah numerik ... 3

1.6 Efesiensi ... 5

1.7 Desain dan Coding Program Desain ... 6

BAB 2 MACAM-MACAM MATEMATIKA ... 9

2.1 Mapping dan Pengaturan ... 9

2.2 Memecahkan Persamaan Kuadrat ... 12

2.3 Trigonometri ... 14

2.4 Vektor ... 17

2.5 Kurva dan Datar ... 26

2.6 Interpolasi Linear ... 39

2.7 Segitiga ... 40

BAB 3 GAMBAR RASTER ... 46

3.1 Perangkat Raster ... 46

3.2 Gambar, Pixel, dan Geometri ... 52

3.3 Warna RGB ... 56

3.4 Komposisi Alpha ... 58

BAB 4 RAY TRACING ... 61

4.1 Dasar Algoritma Ray-Tracing ... 62

4.2 Komputasi Ray ... 64

4.3 Titik Potong Ray-Object ... 67

4.4 Shading ... 72

4.5 Program Ray-Tracing ... 75

4.6 Shadow (Bayangan) ... 76

4.7 Refleksi Spekuler Ideal ... 78

4.8 Catatan Sejarah ... 79

BAB 5 ALJABAR LINIER ... 80

5.1 Determinan ... 80

5.2 Matriks ... 82

5.3 Komputasi dengan Matrik dan Determinasi ... 86

5.4 Eigenvalue dan Diagonalisasi Matriks ... 90

(8)

vi

6.2 Transformasi Linier 3D ... 106

6.3 Translasi dan Transformasi Afin ... 109

6.4 Invers dari Transformasi Matriks ... 112

6.5 Transformasi Koordinat ... 113

BAB 7 VIEWING ... 117

7.1 Melihat Transformasi ... 117

7.2 Transformasi Proyektif ... 123

7.3 Proyeksi Perspektif ... 127

7.4 Beberapa Sifat Transformasi Perspektif ... 130

7.5 FoV (Field-of-View) ... 130

BAB 8 SALURAN GRAFIS ... 133

8.1 Rasterisasi ... 134

8.2 Operasi Sebelum dan Setelah Rasterisasi ... 145

8.3 Anti Aliasing Sederhana ... 151

8.4 Memusnahkan Primitifisasi demi Efisiensi ... 152

BAB 9 PEMROSESAN SINYAL ... 155

9.1 Audio Digital: Sampling di ID ... 156

9.2 Konvolusi ... 158

9.3 Filter Konvolusi ... 160

9.4 Pemrosesan Sinyal untuk Gambar ... 171

9.5 Teori Sampling ... 186

BAB 10 SHADING PERMUKAAN ... 200

10.1 Shading Diffuse ... 200

10.2 Shading Phong ... 203

10.3 Shading Artistik ... 206

BAB 11 MAPPING TEKSTUR ... 208

11.1 Mencari Nilai Tekstur ... 208

11.2 Fungsi Koordinat Tekstur ... 211

11.3 Pencarian Tekstur Antialiasing ... 223

11.4 Aplikasi Mapping Tekstur ... 229

11.5 Tekstur 3D Prosedural ... 234

BAB 12 STRUKTUR DATA GRAFIS ... 240

12.1 Triangle meshes ... 240

12.2 Grafis Scene ... 254

12.3 Struktur Data Spasial ... 256

12.4 Pohon BSP untuk Visibilitas ... 267

12.5 Tiling Multidimensi Array ... 275

BAB 13 RAY TRACING LEBIH DALAM LAGI ... 279

13.1 Refraksi dan Transparansi ... 279

(9)

vii

13.4 Distribusi Ray Tracing ... 285 DAFTAR PUSTAKA ... 294

(10)

BAB 1 PENDAHULUAN

Pengantar

Istilah grafis komputer menggambarkan segala sesuatu yang menggunakan komputer untuk membuat dan memanipulasi gambar. Buku ini menyediakan algoritma dan alat matematika yang dapat Anda gunakan untu k membuat semua jenis gambar, termasuk efek visual fotorealistik, ilustrasi teknis yang informatif, dan animasi komputer yang indah. Grafis bisa dua dimensi atau tiga dimensi. Gambar dapat sepenuhnya digabungkan atau dibuat dengan memproses foto. Buku ini adalah tentang algoritma dan matematika dasar, khususnya matematika yang digunakan untuk membuat gambar komposit objek dan scene 3D.

Sebenarnya melakukan pekerjaan dalam komputer grafis membutuhkan pengetahuan tentang perangkat keras tertentu, format file, dan API grafis.

Catatan : API: application program interface/antarmuka program aplikasi.

1.1 AREA GRAFIS

Menerapkan kategori pada bidang apa pun berbahaya, tetapi sebagian besar praktisi grafis akan setuju pada bidang utama grafis komputer berikut:

Modelling berkaitan dengan spesifikasi matematis dari bentuk dan tampilan properti dengan cara yang dapat disimpan di komputer. Misalnya, cangkir kopi dapat digambarkan sebagai sekumpulan titik 3D yang berurutan bersama dengan beberapa aturan interpolasi untuk menghubungkan titik-titik tersebut dan model pantulan yang menjelaskan interaksi cahaya pertunjukan dengan cangkir.

Rendering adalah istilah yang diwarisi dari seni dan berurusan dengan pembuatan gambar berbayang dari model komputer 3D.

Animasi adalah teknik untuk menciptakan ilusi gerak melalui rangkaian gambar.

Animasi menggunakan pemodelan dan rendering tetapi menambahkan masalah utama pergerakan dari waktu ke waktu, yang biasanya tidak dibahas dalam pemodelan dan rendering dasar.

Ada banyak area lain yang melibatkan grafis komputer Area terkait tersebut meliputi:

User Interaction/Interaksi pengguna berurusan dengan antarmuka antara perangkat input seperti mouse dan tablet, aplikasi, umpan balik (feedback) ke pengguna dalam gambar, dan umpan balik sensorik lainnya. Secara historis, area ini terkait dengan grafis sebagian besar karena peneliti grafis memiliki beberapa akses paling awal ke perangkat input/output yang sekarang ada di mana-mana.

Virtual Reality untuk memasukkan pengguna ke dalam dunia virtual 3D. Ini biasanya membutuhkan setidaknya stereografis dan respons terhadap gerakan kepala. Virtual reality yang nyata, umpan balik suara dan kekuatan harus disediakan juga. Karena area ini memerlukan grafis 3D canggih dan teknologi tampilan canggih, area ini sering dikaitkan dengan grafis.

Visualisasi mencoba memberi pengguna wawasan tentang informasi kompleks melalui tampilan visual. Seringkali ada masalah grafis yang harus diatasi dalam masalah visualisasi.

Image Processing/Pemrosesan gambar berhubungan dengan manipulasi gambar 2D dan digunakan baik dalam bidang grafis maupun penglihatan.

(11)

3D Scanning/Pemindaian 3D menggunakan teknologi pencarian jarak untuk membuat model 3D terukur. Model seperti itu berguna untuk menciptakan gambar visual yang kaya, dan pemrosesan model seperti itu sering kali membutuhkan algoritma grafis

Fotografi komputasional adalah penggunaan grafis komputer, visi komputer, dan metode pemrosesan gambar untuk memungkinkan cara baru menangkap objek, scene, dan lingkungan secara fotografis

1.2 APLIKASI UTAMA

Hampir semua hal menggunakan grafis komputer, tetapi konsumen utama teknologi grafis komputer meliputi industri berikut:

• Video Game semakin banyak menggunakan model dan algoritma rendering 3D yang canggih.

• Kartun sering ditampilkan langsung dari model 3D. Banyak kartun 2D tradisional menggunakan latar belakang yang dirender dari model 3D, yang memungkinkan sudut pandang yang terus bergerak tanpa banyak waktu artis.

• Efek visual menggunakan hampir semua jenis teknologi grafis komputer. Hampir setiap film modern menggunakan pengomposisian digital untuk menempatkan latar belakang dengan latar depan yang difilmkan secara terpisah. Banyak film juga menggunakan pemodelan dan animasi 3D untuk menciptakan lingkungan sintetik, objek, dan bahkan karakter yang kebanyakan penonton tidak akan pernah menduga bahwa itu tidak nyata.

• Film animasi menggunakan banyak teknik yang sama yang digunakan untuk efek visual, tetapi tanpa harus membidik gambar yang terlihat nyata.

• CAD/CAM adalah singkatan dari computer-aided-design dan computer-aided- manufacturing. Bidang-bidang ini menggunakan teknologi komputer untuk merancang komponen dan produk di komputer dan kemudian, menggunakan desain virtual ini, untuk memandu proses manufaktur. Misalnya, banyak bagian mekanis dirancang dalam paket pemodelan komputer 3D dan kemudian diproduksi secara otomatis pada perangkat penggilingan yang dikendalikan komputer.

• Simulasi dapat dianggap sebagai permainan video yang akurat. Misalnya, simulator penerbangan menggunakan grafis 3D canggih untuk mensimulasikan pengalaman menerbangkan pesawat. Simulasi semacam itu dapat sangat berguna untuk pelatihan awal dalam domain kritis-keselamatan seperti mengemudi, dan untuk pelatihan skenario bagi pengguna berpengalaman seperti situasi khusus pemadam kebakaran yang terlalu mahal atau berbahaya untuk dibuat secara fisik.

• Medical Imaging menciptakan gambar yang berarti dari data pasien yang dipindai.

Misalnya, kumpulan data computed tomography (CT) terdiri dari array persegi panjang 3D yang besar dengan nilai kepadatan. Grafis komputer digunakan untuk membuat gambar berbayang yang membantu dokter mengekstrak informasi yang paling menonjol dari data tersebut.

• Visualisasi informasi membuat gambar data yang tidak memiliki penggambaran visual yang “alami”. Misalnya, tren harga sementara saham sering kali berbeda tidak memiliki gambaran visual yang jelas, tetapi teknik grafis yang cerdas dapat membantu manusia melihat pola dalam data tersebut.

1.3 API GRAFIS

Bagian penting dari penggunaan graphics libraries adalah graphicsAPI. Antarmuka program aplikasi/Application program interface (API) adalah kumpulan fungsi standar untuk

(12)

melakukan serangkaian operasi terkait, dan API grafis adalah seperangkat fungsi yang melakukan operasi dasar seperti menggambar gambar dan permukaan 3D ke dalam windows di layar.

Setiap program grafis harus dapat menggunakan dua API terkait: API grafis untuk output visual dan API antarmuka pengguna untuk mendapatkan iput dari User. Saat ini ada dua paradigma dominan untuk grafis dan API antarmuka pengguna. Yang pertama adalah pendekatan terintegrasi, yang dicontohkan oleh Java, di mana grafis dan toolkit antarmuka pengguna terintegrasi dan paket portabel yang sepenuhnya distandarisasi dan didukung sebagai bagian dari bahasa. Yang kedua diwakili oleh Direct3D dan OpenGL, di mana perintah menggambar adalah bagian dari perpustakaan perangkat lunak yang terkait dengan bahasa seperti C++, dan perangkat lunak antarmuka pengguna adalah entitas independen yang mungkin berbeda dari sistem ke sistem. Dalam pendekatan yang terakhir ini, menulis kode portabel bermasalah, meskipun untuk program sederhana dimungkinkan untuk menggunakan lapisan pustaka portabel untuk merangkum kode antarmuka pengguna khusus sistem. Apa pun pilihan API Anda, panggilan grafis dasar sebagian besar akan sama, dan konsep buku ini akan berlaku.

1.4 SALURAN GRAFIS

Setiap komputer desktop saat ini memiliki saluran grafis 3D yang kuat. Ini adalah subsistem perangkat lunak/perangkat keras khusus yang secara efisien menggambar primitif 3D dalam perspektif. Biasanya sistem ini dioptimalkan untuk memproses segitiga 3D dengan simpul bersama. Operasi dasar dalam pipeline memetakan lokasi vertex 3D ke posisi layar 2D dan menaungi segitiga sehingga keduanya terlihat realistis dan muncul dalam urutan back-to- front yang tepat.

Meskipun menggambar segitiga dengan urutan back-to-front yang valid merupakan masalah penelitian paling penting dalam grafis komputer, sekarang hampir selalu diselesaikan dengan menggunakan buffer-z, yang menggunakan buffer memori khusus untuk menyelesaikan masalah dengan cara yang kasar.

Ternyata manipulasi geometris yang digunakan dalam saluran grafis dapat diselesaikan hampir seluruhnya dalam ruang koordinat 4D yang terdiri dari tiga koordinat geometris tradisional dan koordinat homogen keempat yang membantu tampilan perspektif. Koordinat 4D ini dimanipulasi menggunakan matriks 4 × 4 dan 4-vektor. Oleh karena itu, pipeline grafis berisi banyak mesin untuk memproses dan menyusun matriks dan vektor tersebut secara efisien. Sistem koordinat 4D ini adalah salah satu konstruksi paling halus dan indah yang digunakan dalam ilmu komputer, dan tentu saja merupakan rintangan intelektual terbesar yang harus dilewati ketika mempelajari grafis komputer. Sebagian besar bagian pertama dari setiap buku grafis berhubungan dengan koordinat ini.

Kecepatan di mana gambar dapat dihasilkan sangat bergantung pada jumlah segitiga yang digambar. Karena interaktivitas lebih penting dalam banyak aplikasi daripada kualitas visual, sangat bermanfaat untuk meminimalkan jumlah segitiga yang digunakan untuk mewakili model. Selain itu, jika model dilihat dari jauh, segitiga yang dibutuhkan lebih sedikit daripada jika model dilihat dari jarak yang lebih dekat. Hal ini menunjukkan bahwa sangat berguna untuk merepresentasikan model dengan berbagai tingkat detail/level of detail (LOD).

1.5 MASALAH NUMERIK

Banyak program grafis sebenarnya hanya kode numerik 3D. Isu numerik seringkali penting dalam program semacam itu. Di "masa lalu", sangat sulit untuk menangani masalah seperti itu dengan cara yang kuat dan portabel karena mesin memiliki representasi internal

(13)

yang berbeda untuk angka, dan lebih buruk lagi, menangani pengecualian dengan cara yang berbeda dan tidak kompatibel. Untungnya, hampir semua komputer modern sesuai dengan standar titik mengambang IEEE (Asosiasi Standar IEEE, 1985). Hal ini memungkinkan programmer untuk membuat banyak asumsi nyaman tentang bagaimana kondisi numerik tertentu akan ditangani.

Catatan : IEEE floating-point memiliki dua representasi untuk nol, satu yang diperlakukan sebagai positif dan satu yang diperlakukan sebagai negatif. Perbedaan antara – 0 dan +0 hanya kadang-kadang penting, tetapi perlu diingat untuk saat-saat ketika itu penting.

Meskipun IEEE floating-point memiliki banyak fitur yang berharga saat mengkodekan algoritma numerik, hanya ada beberapa yang penting untuk diketahui untuk sebagian besar situasi yang dihadapi dalam grafis. Pertama, dan yang paling penting, adalah memahami bahwa ada tiga nilai "khusus" untuk bilangan real di titik-mengambang IEEE:

1. Tak terhingga (∞). Ini adalah angka valid yang lebih besar dari semua angka valid lainnya.

2. Minus tak terhingga (−∞). Ini adalah nomor valid yang lebih kecil dari semua nomor valid lainnya.

3. Not an number (NaN). Ini adalah bilangan yang tidak valid yang muncul dari operasi dengan konsekuensi yang tidak ditentukan, seperti nol dibagi dengan nol.

Perancang IEEE floating-point membuat beberapa keputusan yang sangat nyaman bagi programmer. Banyak dari ini berhubungan dengan tiga nilai khusus di atas dalam menangani pengecualian seperti pembagian dengan nol. Dalam kasus ini, pengecualian dicatat, tetapi dalam banyak kasus, pemrogram dapat mengabaikannya. Secara khusus, untuk sembarang bilangan real positif a, aturan berikut yang melibatkan pembagian dengan nilai tak hingga berlaku:

+a/(+∞) = +0 ,

−a/(+∞)=−0, +a/(−∞)=−0,

−a/(−∞) = +0 .

Operasi lain yang melibatkan nilai tak terhingga berperilaku seperti yang diharapkan.

Sekali lagi untuk a positif, perilakunya adalah sebagai berikut:

∞+∞ =+∞,

∞−∞= NaN,

∞×∞=∞,

∞/∞ = NaN,

∞/a =∞,

∞/0=∞, 0/0=NaN.

Aturan dalam ekspresi Boolean yang melibatkan nilai tak hingga adalah seperti yang diharapkan:

1. Semua bilangan valid hingga kurang dari +∞.

2. Semua bilangan valid berhingga lebih besar dari -∞.

3. -∞ lebih kecil dari +∞

Aturan yang melibatkan ekspresi yang memiliki nilai NaN sederhana:

1. Ekspresi aritmatika apa pun yang menyertakan NaN menghasilkan NaN.

2. Ekspresi Boolean apa pun yang melibatkanNaN salah.

Mungkin aspek yang paling berguna dari titik IEEE adalah bagaimana pembagian dengan nol ditangani; untuk setiap bilangan real positif, aturan berikut yang melibatkan pembagian dengan nilai nol berlaku:

+a/ +0 = +∞,

(14)

−a/ +0 =−∞.

Ada banyak perhitungan numerik yang menjadi lebih sederhana jika programmer memanfaatkan aturan IEEE. Misalnya, perhatikan ekspresi berikut ini:

𝑎 = 1 1 𝑏+1

𝑐

Ekspresi seperti itu muncul dengan resistor dan lensa. Jika pembagian dengan nol mengakibatkan crash program (seperti yang terjadi dalam banyak sistem sebelum titik mengambang IEEE), maka dua pernyataan if akan diperlukan untuk memeriksa nilai b atau c yang kecil atau nol. Sebaliknya, dengan IEEE floating-point, jika b dan c adalah Nol, maka kita akan mendapatkan nilai Nol juga untuk a seperti yang diinginkan. Teknik umum lainnya untuk menghindari pemeriksaan khusus adalah dengan memanfaatkan properti Boolean dari NaN.

Perhatikan segmen kode berikut:

a = f(x)

Jika/if (a>0) maka/then lakukan yang lain

Di sini, fungsi f dapat mengembalikan nilai “jelek” seperti ∞ atau NaN, tetapi kondisi if masih terdefinisi dengan baik: salah untuk a = NaN atau a = dan benar untuk a = +∞. Dengan hati-hati dalam memutuskan nilai mana yang dikembalikan, seringkali if dapat membuat pilihan yang tepat, tanpa memerlukan pemeriksaan khusus. Hal ini membuat program lebih kecil, lebih kuat, dan lebih efisien.

1.6 EFESIENSI

Tidak ada aturan ajaib untuk membuat kode lebih efisien. Efisiensi dicapai melalui pengorbanan yang hati-hati, dan pengorbanan ini berbeda untuk arsitektur yang berbeda.

Namun, untuk masa mendatang, heuristik yang baik adalah bahwa programmer harus lebih memperhatikan pola akses memori daripada jumlah operasi. Ini adalah kebalikan dari heuristik terbaik dua dekade lalu. Peralihan ini terjadi karena kecepatan memori tidak mengikuti kecepatan prosesor. Sejak tren itu berlanjut, pentingnya akses memori yang terbatas dan koheren untuk optimalisasi hanya akan meningkat.

Pendekatan yang masuk akal untuk membuat kode cepat adalah dengan melanjutkan dalam urutan berikut, hanya mengambil langkah-langkah yang diperlukan:

1. Tulis kode dengan cara yang paling mudah. Hitung hasil antara sesuai kebutuhan pada y daripada menyimpannya.

2. Kompilasi dalam mode yang dioptimalkan.

3. Gunakan alat profil apa pun yang ada untuk menemukan hambatan kritis.

4. Periksa struktur data untuk mencari cara untuk meningkatkan lokalitas. Jika memungkinkan, buat ukuran unit data sesuai dengan ukuran cache/halaman pada arsitektur target.

5. Jika profil mengungkapkan hambatan dalam komputasi numerik, periksa kode perakitan yang dihasilkan oleh kompilator untuk mengetahui efisiensi yang terlewat.

Tulis ulang source code untuk memecahkan masalah yang Anda temukan.

Yang paling penting dari langkah-langkah ini adalah yang pertama. Sebagian besar

"Optimalisasi" membuat kode lebih sulit dibaca tanpa mempercepat segalanya. Selain itu, waktu yang dihabiskan di muka untuk mengoptimalkan kode biasanya lebih baik dihabiskan untuk memperbaiki bug atau menambahkan fitur. Juga, waspadalah terhadap saran dari teks- teks lama; beberapa trik klasik seperti menggunakan bilangan bulat alih-alih nyata mungkin tidak lagi menghasilkan kecepatan karena CPU modern biasanya dapat melakukan operasi titik mengambang secepat mereka melakukan operasi bilangan bulat. Dalam semua situasi,

(15)

pembuatan profil diperlukan untuk memastikan manfaat dari setiap optimasi untuk mesin dan kompiler tertentu.

1.7 DESAIN DAN CODING PROGRAM DESAIN

Strategi umum tertentu sering berguna dalam pemrograman grafis. Di bagian ini kami memberikan beberapa saran yang mungkin berguna bagi Anda saat menerapkan metode yang Anda pelajari dalam buku ini.

Desain Kelas

Bagian utama dari setiap program grafis adalah untuk memiliki kelas atau rutinitas yang baik untuk entitas geometris seperti vektor dan matriks, serta entitas grafis seperti warna dan gambar RGB. Rutinitas ini harus dibuat sebersih dan seefisien mungkin. Sebuah pertanyaan desain universal adalah apakah lokasi dan perpindahan harus menjadi kelas yang terpisah karena mereka memiliki operasi yang berbeda, misalnya, lokasi dikalikan dengan setengah tidak masuk akal secara geometris sementara setengah dari perpindahan tidak. Ada sedikit kesepakatan tentang pertanyaan ini, yang dapat memicu perdebatan sengit selama berjam-jam di antara praktisi grafis, tetapi sebagai contoh mari kita asumsikan kita tidak akan membuat perbedaan.

Ini menyiratkan bahwa beberapa kelas dasar yang akan ditulis meliputi:

• vektor2. Kelas vektor 2D yang menyimpan komponen x-andy. Ini harus menyimpan komponen ini dalam array panjang-2 sehingga operator pengindeksan dapat didukung dengan baik. Anda juga harus memasukkan operasi untuk penjumlahan vektor, pengurangan vektor, perkalian titik, perkalian silang, perkalian skalar, dan pembagian skalar.

• vektor3. Sebuah kelas vektor 3D analog dengan vektor2.

• vektor. Sebuah vektor homogen dengan empat komponen .

• rgb. Warna RGB yang menyimpan tiga komponen. Anda juga harus menyertakan operasi untuk penambahan RGB, pengurangan RGB, perkalian RGB, perkalian skalar, dan pembagian skalar

• transform. Matriks 4x4 untuk transformasi. Anda harus menyertakan perkalian matriks dan fungsi anggota untuk diterapkan ke lokasi, arah, dan vektor normal permukaan. Seperti yang ditunjukkan dalam Bab 6, ini semua berbeda.

• Image. Array 2D piksel RGB dengan operasi output.

Selain itu, Anda mungkin tidak ingin menambahkan kelas untuk interval, basis ortonormal, dan bingkai koordinat.

Mengapung vr Ganda

Arsitektur modern menunjukkan bahwa menjaga penggunaan memori tetap rendah dan mempertahankan akses memori yang koheren adalah kunci efisiensi. Ini menyarankan menggunakan data presisi tunggal. Namun, menghindari masalah numerik menyarankan menggunakan doubleprecisionarithmetic. Pengorbanan tergantung pada programnya, tetapi bagus untuk memiliki default dalam definisi kelas Anda.

Debugging Program Grafis

Anda mungkin menemukan bahwa sebagai programmer menjadi lebih berpengalaman, mereka menggunakan debuggers tradisional dan kurang. Salah satu alasannya adalah bahwa menggunakan debugger seperti itu lebih canggung untuk program yang kompleks daripada untuk program yang sederhana. Alasan lain adalah bahwa kesalahan yang paling sulit adalah kesalahan konseptual di mana hal yang salah sedang diimplementasikan, dan mudah untuk membuang banyak waktu untuk melangkah melalui nilai-nilai variabel tanpa mendeteksi

(16)

kasus seperti itu. Kami telah menemukan beberapa strategi debugging yang sangat berguna dalam grafis.

Metode Ilmiah

Dalam program grafis ada alternatif untuk debugging tradisional yang seringkali sangat berguna. Kelemahannya adalah sangat mirip dengan apa yang diajarkan kepada programmer komputer untuk tidak dilakukan di awal karir mereka, jadi Anda mungkin merasa "nakal" jika Anda melakukannya: kami membuat gambar dan mengamati apa yang salah dengannya.

Kemudian, kami mengembangkan hipotesis tentang apa yang menyebabkan masalah dan mengujinya. Misalnya, dalam program ray-tracing, kita mungkin memiliki banyak piksel gelap yang tampak acak. Ini adalah masalah " jerawat bayangan" klasik yang dialami kebanyakan orang saat mereka menulis pelacak.

Debug tradisional tidak membantu di sini; sebaliknya, kita harus menyadari bahwa sinar bayangan mengenai permukaan yang diarsir. Kita mungkin memperhatikan bahwa warna bintik-bintik gelap adalah warna sekitar, jadi pencahayaan langsunglah yang hilang.

Pencahayaan langsung dapat dimatikan dalam bayangan, jadi Anda mungkin berhipotesis bahwa titik-titik ini salah ditandai sebagai bayangan padahal sebenarnya tidak. Untuk menguji hipotesis ini, kita bisa mematikan pemeriksaan bayangan dan mengkompilasi ulang. Ini akan menunjukkan bahwa ini adalah tes bayangan palsu, dan kami dapat melanjutkan pekerjaan detektif kami. Alasan utama mengapa metode ini terkadang dapat menjadi praktik yang baik adalah karena kita tidak pernah harus menemukan nilai yang salah atau benar-benar menentukan kesalahan konseptual kita. Sebaliknya, kami hanya mempersempit kesalahan konseptual kami secara eksperimental. Biasanya hanya beberapa percobaan yang diperlukan untuk melacak semuanya, dan jenis debugging ini menyenangkan.

Gambar sebagai Output Debugging Berkode

Dalam banyak kasus, saluran termudah untuk mendapatkan informasi debug dari program grafis adalah gambar output itu sendiri. Jika Anda ingin mengetahui nilai beberapa variabel untuk bagian komputasi yang berjalan untuk setiap piksel, Anda dapat memodifikasi program Anda untuk sementara untuk menyalin nilai tersebut secara langsung ke gambar output dan melewatkan sisa penghitungan yang biasanya dilakukan. Misalnya, jika Anda menduga masalah dengan normal permukaan menyebabkan masalah dengan bayangan, Anda dapat menyalin vektor normal langsung ke gambar (x menjadi merah, y menjadi hijau, z menjadi biru), menghasilkan ilustrasi kode warna dari vektor yang sebenarnya digunakan dalam perhitungan Anda. Atau, jika Anda menduga nilai tertentu terkadang berada di luar rentang validnya, buat program Anda menulis piksel cerah di tempat yang terjadi. Trik umum lainnya termasuk menggambar sisi belakang permukaan dengan warna yang jelas (ketika seharusnya tidak terlihat), mewarnai gambar dengan nomor ID objek, atau mewarnai piksel dengan jumlah pekerjaan yang mereka lakukan untuk menghitung.

Menggunakan Debugging

Masih ada kasus, terutama ketika metode ilmiah tampaknya telah menyebabkan kontradiksi, ketika tidak ada pengganti untuk mengamati dengan tepat apa yang sedang terjadi. Masalahnya adalah bahwa program grafis sering kali melibatkan banyak, banyak eksekusi dari kode yang sama (misalnya, sekali per piksel, atau sekali per segitiga), sehingga sama sekali tidak praktis untuk melangkah melalui debugger dari awal. Dan bug yang paling sulit biasanya hanya terjadi untuk input yang rumit.

Pendekatan yang berguna adalah "menetapkan jebakan" untuk bug. Pertama, pastikan program Anda deterministik—berjalan dalam satu utas dan pastikan bahwa semua bilangan acak dihitung dari benih tetap. Kemudian, cari tahu piksel atau segitiga mana yang menunjukkan bug dan tambahkan pernyataan sebelum kode yang Anda curigai salah yang

(17)

akan dieksekusi hanya untuk kasus yang dicurigai. Misalnya, jika Anda menemukan bahwa piksel (126.247) menunjukkan bug, tambahkan:

if x = 126 dan y = 247 then print “gambar!”

Jika Anda menyetel breakpoint pada pernyataan cetak, Anda dapat memasukkan debugger tepat sebelum piksel yang Anda minati dihitung. Beberapadebugger memiliki fitur

"breakpoint bersyarat" yang dapat mencapai hal yang sama tanpa mengubah kode.

Catatan: Mode debug khusus yang menggunakan seed nomor acak tetap berguna.

Dalam kasus di mana program mogok, debugger tradisional berguna untuk menunjukkan dengan tepat situs mogok. Anda kemudian harus mulai melacak kembali dalam program, menggunakan asserts dan mengkompilasi ulang, untuk menemukan di mana letak kesalahan program. Pernyataan ini harus dibiarkan dalam program untuk kemungkinan bug di masa mendatang yang akan Anda tambahkan. Ini sekali lagi berarti proses langkah-melalui tradisional dihindari, karena itu tidak akan menambahkan pernyataan berharga ke program Anda.

Visualisasi Data untuk Debugging

Seringkali sulit untuk memahami apa yang sedang dilakukan program Anda, karena ia menghitung banyak hasil antara sebelum akhirnya salah. Situasinya mirip dengan eksperimen ilmiah yang mengukur banyak data, dan satu solusinya sama: buat plot dan ilustrasi yang bagus untuk Anda sendiri untuk memahami apa arti data itu. Misalnya, dalam ray tracer Anda dapat menulis kode untuk memvisualisasikan pohon ray sehingga Anda dapat melihat jalur apa yang berkontribusi pada piksel, atau dalam rutinitas pengambilan sampel ulang gambar, Anda dapat membuat plot yang menunjukkan semua titik di mana sampel diambil dari input.

Waktu yang dihabiskan untuk menulis kode untuk memvisualisasikan keadaan internal program Anda juga terbayar dalam pemahaman yang lebih baik tentang perilakunya ketika tiba saatnya untuk mengoptimalkannya.

(18)

BAB 2

MACAM-MACAM MATEMATIKA

Sebagian besar grafis hanya menerjemahkan matematika langsung ke dalam kode.

Matematika bersih, kode hasil pembersih, sebagian besar dari buku ini berkonsentrasi pada penggunaan matematika yang tepat untuk pekerjaan itu. Bab ini mengulas berbagai alat dari matematika sekolah menengah dan perguruan tinggi dan dirancang untuk digunakan lebih sebagai referensi daripada sebagai tutorial. Ini mungkin tampak seperti campuran topik dan memang demikian; setiap topik dipilih karena agak tidak biasa dalam kurikulum matematika

"standar", karena sangat penting dalam grafis, atau karena biasanya tidak diperlakukan dari sudut pandang geometris. Selain membangun ulasan tentang notasi yang digunakan dalam buku, bab ini juga menekankan beberapa poin yang terkadang dilewati dalam kurikulum standar sarjana, seperti koordinat barycentric pada segitiga.

Sebuah diskusi tentang aljabar linier ditunda sampai Bab 5 sebelum matriks transformasi dibahas. Pembaca didorong untuk membaca sekilas bab ini untuk membiasakan diri dengan topik yang dibahas dan untuk merujuk kembali jika diperlukan. Latihan di akhir bab mungkin berguna dalam menentukan topik mana yang perlu disegarkan.

2.1 MAPPING DAN PENGATURAN

Mapping, juga disebut fungsi, ini adalah dasar matematika dan pemrograman. Seperti fungsi dalam program, mapping dalam matematika mengambil argumen dari satu tipe dan memetakannya ke (mengembalikan) objek dari tipe tertentu. Dalam sebuah program kami mengatakan "ketik"; dalam matematika kita akan mengidentifikasi himpunan. Ketika kita memiliki objek yang merupakan anggota dari suatu himpunan, kita menggunakan simbol ϵ.

Sebagai contoh,

a ϵ S

dapat dibaca “a adalah anggota himpunan S”. Diketahui dua himpunan A dan B, kita dapat membuat himpunan ketiga dengan mengambil produk Cartesian dari dua himpunan, dilambangkan dengan A × B. Himpunan A × B ini terdiri dari semua kemungkinan pasangan terurut (a,b) di mana a ϵ A dan b ϵ B. Sebagai singkatan, kami menggunakan notasi A2 untuk menunjukkan A×A. Kita dapat memperluas hasil kali Cartesian untuk membuat himpunan dari semua kemungkinan rangkap tiga terurut dari tiga himpunan dan seterusnya untuk tupel terurut panjang sewenang-wenang dari banyak himpunan sewenang-wenang. Commonset yang menarik termasuk

• R—bilangan real;

• R+—bilangan real nonnegatif (termasuk nol);

• R2—pasangan terurut dalam bidang 2D nyata;

• Rn—titik-titik dalam ruang Kartesius n-dimensi;

• Z—bilangan bulat;

• S2—kumpulan titik 3D (titik di R3) pada unit bola.

Perhatikan bahwa meskipun S2 terdiri dari titik-titik yang tertanam dalam ruang tiga dimensi, mereka berada di permukaan yang dapat diparameterisasi dengan dua variabel, sehingga dapat dianggap sebagai himpunan 2D. Notasi untuk mapping menggunakan tanda panah dan titik dua, misalnya:

f : R → Z,

yang dapat Anda baca sebagai "Ada fungsi yang disebut f yang mengambil bilangan real sebagai input dan peta untuk bilangan bulat." Di sini, himpunan yang muncul sebelum

(19)

panah disebut domain fungsi, dan himpunan di ruas kanan disebut target. Pemrogram komputer mungkin lebih nyaman dengan bahasa setara berikut: "Ada fungsi yang disebut f yang memiliki satu argumen nyata dan mengembalikan bilangan bulat." Dengan kata lain, notasi himpunan di atas setara dengan notasi pemrograman umum:

bilangan bulat f(real) ← ekuivalen → f : R → Z.

Jadi notasi tanda titik dua dapat dianggap sebagai sintaks pemrograman. Sesederhana itu. Titik f(a) disebut image dari a, dan bayangan himpunan A (subset dari domain) adalah himpunan bagian dari target yang memuat bayangan semua titik di A. Bayangan seluruh domain adalah disebut jangkauan fungsi.

Gambar 2.1. Bijeksi dan fungsi invers f−1. Perhatikan bahwa f-1 juga merupakan bijeksi.

Invers Mapping

Jika kita memiliki fungsi f : A → B, mungkin ada fungsi invers f−1 : B → A, yang didefinisikan oleh aturan f−1(b)=a di mana b = f(a). Definisi ini hanya berfungsi jika setiap b ∈ B adalah bayangan dari suatu titik di bawah f (yaitu, jangkauannya sama dengan target) dan jika hanya ada satu titik tersebut (yaitu, hanya ada satu di mana f(a)=b). Mapping atau fungsi seperti itu disebut bijeksi. Sebuah bijeksi memetakan setiap a ∈ A ke b ∈ B unik, dan untuk setiap b ∈ B, ada tepat satu a ∈ A sedemikian rupa sehingga f(a)=b (Gambar 2.1). Bijeksi antara sekelompok penunggang dan kuda menunjukkan bahwa setiap orang menunggangi seekor kuda, dan setiap kuda ditunggangi. Dua fungsi akan menjadi pengendara (kuda) dan kuda (penunggang). Ini adalah fungsi terbalik satu sama lain. Fungsi yang bukan bijeksi tidak memiliki invers (Gambar 2.2).

Contoh bijeksi adalah f : ℝ →ℝ, dengan f(x)=x3. Fungsi inversnya adalah f−1(x)= ∛x.

Contoh ini menunjukkan bahwa notasi standar bisa agak aneh karena x digunakan sebagai variabel dummy di f dan f−1. Terkadang lebih intuitif untuk menggunakan variabel dummy yang berbeda, dengan y = f(x) dan x = f−1(y). Hasil ini semakin intuitif y= x3 dan x = ∛y. Contoh fungsi yang tidak memiliki invers adalah sqr : ℝ →ℝ, dimana sqr(x)=x2. Ini benar karena dua alasan:

pertama x2 =(−x)2, dan kedua tidak ada anggota domain yang memetakan ke bagian negatif dari target. Perhatikan bahwa kita dapat mendefinisikan invers jika kita membatasi domain dan jangkauan ke ℝ+. Maka x adalah invers yang valid.

(20)

Gambar 2.2 Fungsi g tidak memiliki invers karena dua elemen d dipetakan ke elemen E yang sama. Fungsi h tidak memiliki invers karena elemen T dari F tidak memiliki elemen d yang

dipetakan padanya.

Interval

Seringkali kita ingin menentukan bahwa suatu fungsi berhubungan dengan bilangan real yang dibatasi nilainya. Salah satu kendala tersebut adalah untuk menentukan interval.

Contoh interval adalah bilangan real antara nol dan satu, tidak termasuk nol atau satu. Kami menunjukkan ini (0,1). Karena tidak menyertakan titik akhirnya, ini disebut sebagai interval terbuka. Interval tertutup yang sesuai, yang memang berisi titik akhirnya, dilambangkan dengan tanda kurung siku: [0,1]. Notasi ini dapat dicampur, yaitu [0,1] termasuk nol tetapi tidak satu. Saat menulis interval [a,b], kita asumsikan bahwa a ≤ b. Tiga cara umum untuk merepresentasikan interval ditunjukkan pada Gambar 2.3. Produk interval Cartesian sering digunakan. Misalnya, untuk menunjukkan bahwa suatu titik x berada dalam kubus satuan dalam 3D, kita katakan x ϵ [0,1]3.

Interval sangat berguna dalam hubungannya dengan operasi himpunan: Intersection / persimpangan, Union / penyatuan, dan Different / perbedaan. Misalnya, perpotongan dua interval adalah himpunan titik-titik yang memiliki kesamaan. Simbol digunakan untuk

persimpangan. Misalnya, [3,5] ∩ [4,6]

= [4,5]. Forunions, simbol digunakan untuk menunjukkan titik di salah satu interval. Misalnya, [3,5] ∪ [4,6] = [3,6]. Berbeda dengan dua operator pertama, operator perbedaan menghasilkan hasil yang berbeda tergantung pada urutan argumen.

Gambar 2.3 (kiri atas) Tiga cara ekuivalen untuk menyatakan interval dari a ke b yang mencakup b tetapi tidak a.

Tanda minus digunakan untuk operator selisih, yang mengembalikan titik-titik di interval kiri yang tidak juga di kanan. Misalnya, [3,5)−[4,6] = [3,4] dan [4,6]−[3,5] = [5,6].

Operasi ini sangat mudah untuk divisualisasikan menggunakan diagram interval (Gambar 2.4).

Gambar 2.4 (gambar sebelah kanan ) Operasi interval pada [3,5) dan [4,6].

(21)

Logaritma

Meskipun tidak lazim hari ini seperti sebelum kalkulator, logaritma sering berguna dalam masalah di mana persamaan dengan istilah eksponensial muncul. Menurut definisi, setiap logaritma memiliki basis a. "Basis log a" dari x ditulis loga x dan didefinisikan sebagai

"eksponen ke mana a harus dinaikkan untuk mendapatkan x," yaitu, y = loga x ↔ ay = x

Perhatikan bahwa basis logaritma a dan fungsi yang menaikkan pangkat a adalah saling invers. Definisi dasar ini memiliki beberapa konsekuensi:

a loga(x) = x;

loga(ax)=x;

loga(xy) = loga x + loga y;

loga(x/y) = loga x−loga y;

loga x = loga b logb x

Ketika kita menerapkan kalkulus pada logaritma, angka khusus e =2.718...sering muncul. Logaritma dengan basis e disebut logaritma natural. Kami mengadopsi singkatan umum ln untuk menunjukkannya:

x ≡ loge x.

Perhatikan bahwa simbol "≡" dapat dibaca "setara dengan definisi." Seperti π, nomor khusus e muncul dalam sejumlah konteks yang luar biasa. Banyak bidang menggunakan basis tertentu selain e untuk manipulasi dan menghilangkan basis dalam notasinya, yaitu log x.

Misalnya, astronom sering menggunakan basis 10 dan ilmuwan komputer teoretis sering menggunakan basis 2. Karena grafis komputer meminjam teknologi dari banyak bidang, kita akan menghindari singkatan ini. Turunan dari logaritma dan eksponen menjelaskan mengapa logaritma natural adalah “natural”:

𝒅

𝒅𝒙𝒍𝒐𝒈𝒂𝒙 = 𝟏 𝒙 𝒅𝒊 𝒂; 𝒅

𝒅𝒙𝒂𝒙 = 𝒂𝒙 𝒅𝒊 𝒂 Pengganda konstanta di atas hanya satu untuk a = e.

2.2 MEMECAHKAN PERSAMAAN KUADRAT Persamaan kuadrat memiliki bentuk

Ax2 + Bx + C = 0

Di mana x tidak diketahui nyata, dan A, B, dan C adalah konstanta yang diketahui. Jika Anda memikirkan plot 2D xy dengan y = Ax2 + Bx+ C, solusinya adalah apa pun nilai x yang merupakan “nol persilangan” di y. Karena y = Ax2 + Bx + C adalah parabola, maka akan ada nol, satu, atau dua solusi nyata tergantung pada apakah parabola meleset, menyerempet, atau menyentuh sumbu x (Gambar 2.5).

(22)

Gambar 2.5. Interpretasi geometrik dari root (akar) persamaan kuadrat adalah titik potong parabola dengan sumbu x.

Untuk menyelesaikan persamaan kuadrat secara analitik, pertama-tama kita bagi dengan A:

𝒙𝟐+𝑩 𝑨𝒙 + 𝑪

𝑨= 𝟎 Kemudian kami "menyelesaikan kotak" ke group terms:

(𝒙 + 𝑩 𝟐𝑨)

𝟐

− 𝑩𝟐 𝟒𝑨𝟐+𝑪

𝑨= 𝟎

Memindahkan bagian konstan ke ruas kanan dan mengambil akar kuadrat memberikan

𝒙 + 𝑩

𝟐𝑨= ∓√𝑩𝟐 𝟒𝑨𝟐−𝑪

𝑨

Mengurangi B/(2A) dari kedua sisi dan mengelompokkan suku dengan penyebut 2A menghasilkan bentuk yang sudah dikenal:1

𝒙 = −𝑩 ± √𝑩𝟐− 𝟒𝑨𝑪

Di sini simbol “±” berarti ada dua solusi, satu dengan tanda plus dan satu lagi dengan 𝟐𝑨 tanda minus. Jadi 3±1 sama dengan “dua atau empat”. Perhatikan bahwa suku yang menentukan banyaknya solusi nyata adalah

D ≡ B2 – 4AC

Yang disebut diskriminan persamaan kuadrat. Jika D > 0, ada dua solusi real (disebut juga akar). Jika D = 0, ada satu solusi nyata (akar “ganda”). Jika D < 0, tidak ada solusi nyata.

Misalnya, akar dari 2x2 +6x+4=0 adalah x = −1 dan x = 2, dan persamaan x2+x+1 tidak memiliki solusi nyata. Diskriminan dari persamaan ini masing-masing adalah D =4 dan D = 3, jadi kita harapkan banyaknya solusi yang diberikan. Dalam program, biasanya merupakan ide yang baik

1 Implementasi yang kuat akan menggunakan ekspresi setara 2C/(−B ∓ √B2 - 4AC) untuk menghitung salah satu akar, tergantung pada tanda B (Latihan 7).

(23)

untuk mengevaluasi D terlebih dahulu dan mengembalikan "tidak ada akar" tanpa mengambil akar kuadrat jika D negatif.

2.3 TRIGONOMETRI

Dalam grafis kami menggunakan konteks dasar trigonometri inman. Biasanya, tidak ada yang terlalu mewah, dan sering kali membantu mengingat definisi dasar.

Sudut (Angel)

Meskipun kita menganggap sudut sebagai sesuatu yang biasa, kita harus kembali ke definisinya sehingga kita dapat memperluas gagasan tentang sudut ke dalam bola. Sebuah sudut terbentuk antara dua setengah garis (sinar tak hingga yang berasal dari titik asal) atau arah, dan beberapa konvensi harus digunakan untuk memutuskan antara dua kemungkinan sudut yang dibuat di antara mereka seperti yang ditunjukkan pada Gambar 2.6. Sudut didefinisikan oleh panjang segmen busur yang dipotongnya pada lingkaran satuan. Sebuah konvensi umum adalah bahwa panjang busur yang lebih kecil digunakan, dan tanda sudut ditentukan oleh urutan di mana dua setengah garis ditentukan. Menggunakan konvensi itu, semua sudut berada dalam kisaran [−π,π].

Gambar 2.6 Dua setengah garis memotong lingkaran satuan menjadi dua busur.

Panjang salah satu busur adalah sudut sah "antara" dua setengah garis. Kita dapat menggunakan konvensi bahwa panjang yang lebih kecil adalah sudutnya, atau bahwa dua setengah garis ditentukan dalam urutan tertentu dan busur yang menentukan sudut adalah busur yang ditarik berlawanan arah jarum jam dari setengah garis pertama ke kedua.

Masing-masing sudut ini adalah panjang busur lingkaran satuan yang "dipotong" oleh dua arah. Karena keliling lingkaran satuan adalah 2π, maka dua sudut yang mungkin berjumlah 2π. Satuan panjang busur ini adalah radian. Satuan umum lainnya adalah derajat, di mana keliling lingkaran adalah 360 derajat. Jadi, sudut radian π adalah 180°, biasanya dilambangkan 180◦. Konversi antara derajat dan radian adalah

𝒅𝒆𝒓𝒂𝒋𝒂𝒕 = 𝟏𝟖𝟎

𝝅 𝒓𝒂𝒅𝒊𝒂𝒏 𝒓𝒂𝒅𝒊𝒂𝒏 = 𝟏𝟖𝟎

𝝅 𝒅𝒆𝒓𝒂𝒋𝒂𝒕 Fungsi Trigonometri

Diberikan segitiga siku-siku dengan panjang sisi a, o, dan h, di mana adalah panjang sisi terpanjang (yang selalu berlawanan dengan sudut siku-siku), atau sisi miring, hubungan penting dijelaskan oleh Teorema Pythagoras:

a2 + o2 =h2

Anda dapat melihat bahwa ini benar dari Gambar 2.7, di mana kotak besar memiliki luas (a+o)2, keempat segitiga memiliki luas gabungan 2ao, dan kotak tengah memiliki luas h2

(24)

Gambar 2.7 Demonstrasi geometri dari teorema Pythagoras.

Karena segitiga dan bujur sangkar bagian dalam membagi persegi yang lebih besar secara merata, kita memiliki 2ao + h2 =( a + o)2, yang mudah dimanipulasi ke bentuk di atas.

Kami mendefinisikan sinus dan cosinus dari ∅, serta ekspresi trigonometri berbasis rasio lainnya:

sinϕ≡ o/h;

cscϕ≡ h/o;

cosϕ≡ a/h;

secϕ≡ h/a;

tanϕ≡ o/a;

cotϕ≡ a/o.

Definisi ini memungkinkan kita untuk mengatur koordinat kutub, di mana sebuah titik dikodekan sebagai jarak dari titik asal dan sudut bertanda relatif terhadap sumbu x positif (Gambar 2.8). Perhatikan konvensi bahwa sudut berada dalam rentang ∅∈ (−π,π], dan bahwa sudut positif berlawanan arah jarum jam dari sumbu x positif. Konvensi ini yang berlawanan arah jarum jam memetakan ke bilangan positif arbitrer, tetapi digunakan dalam banyak konteks dalam grafissehingga perlu dilakukan Penyimpanan

Gambar 2.8 Koordinat kutub untuk titik (xa, ya)= (1,√3) adalah (ra, ∅a) = (2,π/3).

Fungsi trigonometri bersifat periodik dan dapat mengambil sudut apa pun sebagai argumen. Misalnya, sin(A) = sin(A +2π). Ini berarti fungsi-fungsi tersebut tidak dapat dibalik jika dipertimbangkan dengan domain R. Masalah ini dihindari dengan membatasi jangkauan fungsi invers standar, dan ini dilakukan dengan cara standar di hampir semua perpustakaan matematika modern (misalnya, (Plauger, 1991)). Domain dan rentang adalah:

asin : [−1,1] ⟼ [−π/2,π/2];

acos : [−1,1] ⟼ [0,π];

atan : ℝ ⟼ [−π/2,π/2];

atan2 : ℝ ⟼ [−π,π].

Fungsi terakhir, atan2(s,c) seringkali sangat berguna. Dibutuhkan nilai s yang proporsional dengan sin A dan nilai c yang menskalakan cosA dengan faktor yang sama dan

(25)

mengembalikan A. Faktor tersebut diasumsikan positif. Salah satu cara untuk memikirkan hal ini adalah bahwa ia mengembalikan sudut titik Cartesian 2D (s,c) dalam koordinat kutub (Gambar 2.9).

Gambar 2.9 Fungsi atan2(s,c) mengembalikan sudut A dan seringkali sangat berguna dalam grafis.

Identitas yang Berguna

Bagian ini mencantumkan tanpa turunan berbagai identitas trigonometri yang berguna.

Identitas Shifting:

sin(−A)=−sin A cos(−A) = cos A tan(−A)=−tan A sin(π/2−A) = cos A cos(π/2−A) = sin A tan(π/2−A) = cot A Identitas Pitagoras :

sin2 A + cos 2 A =1 sec2 A−tan2 A =1 csc2 A−cot2 A =1 Identitas substraksi dan tambahan :

𝒔𝒊𝒏(𝑨 + 𝑩) = 𝒔𝒊𝒏 𝑨 𝒄𝒐𝒔 𝑩 + 𝒔𝒊𝒏 𝑩 𝒄𝒐𝒔 𝑨 sin(A-B) = sin A cos B – sin B cos A

sin(2A) = 2 sin A cos A

cos(A+B) = cos A cos B – sin A sin B cos(A-B) = cos A cos B + sin A sin B

cos(2A) = cos2 A – sin2 A 𝒕𝒂𝒏(𝑨 + 𝑩) = 𝒕𝒂𝒏 𝑨 + 𝒕𝒂𝒏 𝑩

𝟏 − 𝒕𝒂𝒏 𝑨 𝒕𝒂𝒏 𝑩 𝒕𝒂𝒏(𝑨 − 𝑩) = 𝒕𝒂𝒏 𝑨 − 𝒕𝒂𝒏 𝑩

𝟏 + 𝒕𝒂𝒏 𝑨 𝒕𝒂𝒏 𝑩 𝒕𝒂𝒏(𝟐𝑨) = 𝟐 𝒕𝒂𝒏 𝑨

𝟏 − 𝒕𝒂𝒏𝟐𝑨 Identitas Hlf-Angle (setengah sudut):

sin2(A/2)=(1-cosA)/2 cos2(A/2)=(1-cosA)/2 Identitas Produk :

sin A sin B = -(cos(A+B) – cos(A-B))/2 sin A cos B = (sin(A+B) + sin(A-B))/2 cos A cos B = (cos(A+B) + cos(A-B))/2

(26)

Identitas berikut adalah untuk segitiga sembarang dengan panjang sisi a, b, dan c, masing-masing dengan sudut di hadapannya diberikan oleh A, B, C, masing-masing (Gambar 2.10):

𝒔𝒊𝒏 𝑨

𝒂 =𝒔𝒊𝒏 𝑩

𝒃 = 𝒔𝒊𝒏 𝑪

𝒄 (𝒉𝒖𝒌𝒖𝒎 𝒔𝒊𝒏) 𝒄𝟐 = 𝒂𝟐+ 𝒃𝟐− 𝟐𝒂𝒃 𝒄𝒐𝒔 𝑪 (𝑯𝒖𝒌𝒖𝒎 𝒄𝒐𝒔)

𝒂 + 𝒃

𝒂 − 𝒃=𝒕𝒂𝒏 (𝑨 + 𝑩 𝟐 ) 𝒕𝒂𝒏 (𝑨 − 𝑩

𝟐 )

(𝑯𝒖𝒌𝒖𝒎 𝒕𝒂𝒏) Luas segitiga juga dapat dihitung berdasarkan panjang sisi berikut:

𝐴𝑟𝑒𝑎 𝑆𝑒𝑔𝑖𝑡𝑖𝑔𝑎 = 1

4√(𝑎 + 𝑏 + 𝑐)(−𝑎 + 𝑏 + 𝑐)(𝑎 − 𝑏 + 𝑐)(𝑎 + 𝑏 − 𝑐)

Gambar 2.10 Geometri untuk hukum segitiga.

2.4 VEKTOR

Sebuah vektor menggambarkan panjang dan arah. Hal ini dapat berguna diwakili oleh panah. Dua vektor sama jika mereka memiliki panjang dan arah yang sama bahkan jika kita menganggapnya berada di tempat yang berbeda (Gambar 2.11). Sebisa mungkin, Anda harus menganggap vektor sebagai panah dan not sebagai koordinat atau angka. Pada titik tertentu kita harus merepresentasikan vektor sebagai angka dalam program kita, tetapi bahkan dalam kode mereka harus dimanipulasi sebagai objek dan hanya operasi vektor tingkat rendah yang harus tahu tentang representasi numeriknya. Vektor akan direpresentasikan sebagai karakter tebal, mis., a. Panjang suatu vektor dilambangkan ||a||.Vektor satuan adalahvektor yang panjangnya adalah satu. Vektor nol adalah vektor dengan panjang nol. Arah vektor nol tidak terdefinisi.

Vektor dapat digunakan untuk mewakili banyak hal yang berbeda. Misalnya, mereka dapat digunakan untuk menyimpan offset, juga disebut displacement. Jika kita tahu "harta terkubur dua langkah ke timur dan tiga langkah ke utara dari tempat pertemuan rahasia,"

maka kita tahu offsetnya, tapi kita tidak tahu harus mulai dari mana. Vektor juga dapat digunakan untuk menyimpan lokasi, kata lain untuk posisi atau titik. Lokasi dapat direpresentasikan sebagai perpindahan dari lokasi lain. Biasanya ada beberapa lokasi asal yang dipahami dari mana semua lokasi lain disimpan sebagai offset. Perhatikan bahwa lokasi bukan vektor. Seperti yang akan kita bahas, Anda dapat menambahkan dua vektor. Namun, biasanya tidak masuk akal untuk menambahkan dua lokasi kecuali itu adalah operasi perantara ketika menghitung rata-rata tertimbang dari suatu lokasi. Menambahkan dua offset memang masuk akal, jadi itulah salah satu alasan mengapa offset adalah vektor. Tapi ini menekankan bahwa lokasi bukanlah offset; itu adalah offset dari lokasi asal tertentu. Offset dengan sendirinya bukanlah lokasi.

(27)

Gambar 2.11 Kedua vektor ini sama karena memiliki panjang dan arah yang sama

Operasi Vektor

Vektor memiliki sebagian besar operasi aritmatika biasa yang kita kaitkan dengan bilangan real. Dua vektor sama jika dan hanya jika mereka memiliki panjang dan arah yang sama. Dua vektor ditambahkan sesuai dengan aturan jajaran genjang. Aturan ini menyatakan bahwa jumlah dua vektor diperoleh dengan menempatkan salah satu ekor vektor terhadap kepala yang lain (Gambar 2.12). Jumlah vektor adalah vektor yang "menyelesaikan segitiga"

dimulai oleh dua vektor. Jajar genjang dibentuk dengan mengambil jumlah di kedua urutan.

Hal ini menekankan bahwa penjumlahan vektor bersifat komutatif:

a + b = b + a

Perhatikan bahwa aturan jajaran genjang hanya memformalkan intuisi kita tentang perpindahan. Pikirkan berjalan di sepanjang satu vektor, ekor ke kepala, dan kemudian berjalan di sepanjang yang lain.

Gambar 2.12 Dua vektor ditambahkan dengan mengaturnya dari kepala ke ekor. Ini dapat dilakukan dalam urutan apa pun.

Net Displacement hanyalah diagonal jajar genjang. Anda juga dapat membuat minus unary untuk sebuah vektor: a (Gambar 2.13) adalah vektor dengan panjang yang sama dengan a tetapi arahnya berlawanan. Hal ini memungkinkan kita untuk juga mendefinisikan pengurangan:

b – a ≡ - a + b

Anda dapat memvisualisasikan pengurangan vektor dengan jajaran genjang (Gambar 2.14). Kita bisa menulis

a + (b – a) = b

Vektor juga bisa dikalikan. Sebenarnya, ada beberapa jenis produk yang melibatkan vektor. Pertama, kita dapat menskalakan vektor dengan mengalikannya dengan bilangan real k. Ini hanya mengalikan panjang vektor tanpa mengubah arahnya. Misalnya, 3,5a adalah vektor yang arahnya sama dengan a tetapi panjangnya 3,5 kali a. Kami membahas dua produk yang melibatkan dua vektor, produk titik dan perkalian silang, nanti di bagian ini, dan produk yang melibatkan tiga vektor, determinan, di Bab 5.

(28)

Gambar 2.13 Vektor –a memiliki panjang yang sama tetapi berlawanan arah dgn vektor a.

Gambar 2.14 Pengurangan vektor hanyalah penjumlahan vektor dengan pembalikan argumen kedua.

Gambar 2.15 Setiap vektor 2D c adalah jumlah berbobot dari dua vektor 2D tak sejajar a & b.

Gambar 2.16 Dasar Cartesian 2D untuk vektor.

Koordinat Cartesian dari Vektor

Sebuah vektor 2D dapat ditulis sebagai kombinasi dari dua vektor bukan nol yang tidak sejajar. Sifat kedua vektor ini disebut independensi linier. Dua vektor bebas linier membentuk basis 2D, dan vektor-vektor tersebut disebut sebagai vektor basis. Sebagai contoh, sebuah vektor c dapat dinyatakan sebagai kombinasi dari dua vektor basis a dan b (Gambar 2.15):

C = aca + bcb

(29)

Perhatikan bahwa bobot ac dan bc adalah unik. Basa sangat berguna jika kedua vektor ortogonal, yaitu, mereka tegak lurus satu sama lain. Bahkan lebih berguna jika mereka juga vektor satuan dalam hal ini mereka ortonormal. Jika kita menganggap dua vektor "khusus" x dan y diketahui oleh kita, maka kita dapat menggunakannya untuk mewakili semua vektor lain dalam sistem koordinat Kartesius, di mana setiap vektor direpresentasikan sebagai dua bilangan real. Sebagai contoh, sebuah vektor a dapat direpresentasikan sebagai

a = xax + yay

dimana xa dan ya adalah koordinat Cartesian nyata dari vektor 2D a (Gambar 2.16).

Perhatikan bahwa ini secara konseptual tidak berbeda dengan Persamaan (2.3), di mana vektor basisnya tidak ortonormal. Tetapi ada beberapa keuntungan dari sistem koordinat Cartesian. Misalnya, dengan teorema Pythagoras, panjang a adalah

||𝒂|| = √𝒙𝟐𝒂+ 𝒚𝟐𝒂

Menghitung perkalian titik, perkalian silang, dan koordinat vektor dalam sistem Cartesian juga mudah, seperti yang akan kita lihat di bagian berikut. Dengan konvensi kita menulis koordinat baik sebagai pasangan terurut (xa,ya) atau matriks kolom:

𝒂 = [𝒙𝒂 𝒚𝒂]

Bentuk yang kita gunakan akan tergantung pada kenyamanan tipografi. Kami juga kadang-kadang akan menulis vektor sebagai matriks baris, yang akan kami tunjukkan sebagai aT:

aT = [xa ya]

Kami juga dapat mewakili 3D, 4D, dll, vektor dalam koordinat Cartesian. Untuk kasus 3D, kami menggunakan vektor basis z yang ortogonal untuk x dan y

Produk Dot

Cara paling sederhana untuk mengalikan dua vektor adalah produk titik. Hasil kali titik dari a dan b dilambangkan dengan a·b dan sering disebut hasil kali skalar karena menghasilkan skalar. Produk titik mengembalikan nilai yang terkait dengan panjang argumennya dan sudut di antara keduanya (Gambar 2.17):

a . b = ||a|| ||b|| cos ∅

Penggunaan produk titik yang paling umum dalam program grafis adalah untuk menghitung kosinus sudut antara dua vektor. Produk titik juga dapat digunakan untuk menemukan proyeksi satu vektor ke vektor lainnya. Ini adalah panjang a→b dari vektor yang diproyeksikan tegak lurus pada vektor b (Gambar 2.18):

a → b = ||a|| cos ∅ = a . b / ||b||

Produk titik mematuhi sifat asosiatif dan distributif yang kita miliki dalam aritmatika nyata:

a·b = b·a,

a·(b + c)=a·b + a·c, (ka)·b = a·(kb)=ka·b.

Jika vektor 2D a dan b dinyatakan dalam koordinat Cartesian, kita dapat memanfaatkan x · x = y · y =1 dan x · y = 0 untuk memperoleh hasil kali titiknya adalah

a·b = (xax + yay)·(xbx + yby)

= xaxb(x·x)+xayb(x·y)+xbya(y·x)+yayb(y·y)

= xaxb + yayb. Demikian pula dalam 3D kita dapat menemukan

a·b = xaxb + yayb + zazb.

(30)

Gambar 2.17 Produk titik terkait dengan panjang dan sudut dan merupakan salah satu rumus terpenting dalam grafis.

Gambar 2.18 Proyeksi a ke b adalah panjang yang ditemukan oleh Persamaan (2.5).

Perkalian Silang

Perkalian silang a×b biasanya hanya digunakan untuk vektor tiga dimensi; perkalian silang umumdibahas dalam referensi yang diberikan dalam catatan bab. Perkalian silang mengembalikan vektor 3D yang tegak lurus terhadap dua argumen dari perkalian silang.

Panjang vektor yang dihasilkan berhubungan dengan sin ∅:

||a x b|| = ||a|| ||b|| sin ∅

Besarnya ||a×b|| sama dengan luas jajar genjang yang dibentuk oleh vektor a dan b.

Selain itu, a×b tegak lurus terhadap a dan b (Gambar 2.19). Perhatikan bahwa hanya ada dua kemungkinan arah untuk vektor semacam itu. Secara definisi, vektor-vektor pada arah sumbu x-, y- dan z diberikan oleh

x = (1 ,0,0), y = (0 ,1,0), z = (0 ,0,1),

dan kami menetapkan sebagai konvensi bahwa x×y harus dalam arah plus atau minus z. Pilihannya agak sewenang-wenang, tetapi standar untuk mengasumsikan bahwa

z = x × y

Semua permutasi yang mungkin dari ketiga vektor satuan kartesius adalah x×y =+ z,

y×x = −z, y×z =+ x, z×y = −x, z×x =+ y, x×z = −y.

Referensi

Dokumen terkait

Seiring dengan berjalannya waktu Undang-Undang Nomor 13 Tahun 1961 yang sudah tidak relevan lagi dengan pertumbuhan dan perkembangan hukum serta ketatanegaraan di

Berdasarkan hasil analisis pada setiap instrumen pengambilan data dan hasil penelitian yang relevan dapat disimpulkan bahwa siswa kelas VII K SMP negeri 7

02/I/TL.00/523/XII/2011,perihal izin peneitian dalam rangka Penelitian Tindakan Kelas maka dengan hormat disampaikan bahwa kami mengijinkan saudara Siti Nailil Munah

Hasil akhir dari penelitian ini berupa beberapa model jalur-jalur mobilitas penduduk Kelurahan Condongcatur yang dapat memberikan informasi mengenai jalur yang optimal dan

Berdasarkan penelitian terdahulu, melakukan strategi pengembangan model bisnis atau melakukan analisis model bisnis untuk mengetahui posisi perusahaan dengan menggunakan

Pada penelitian ini sengaja memasukan data sekunder berupa hasil pemeriksaan mikrodelesi gen AZF dan SRY yang telah dikerjakan pada proyek penelitian sebelumnya

Dengan berbagai kolom kromatografi flash kinerja tinggi, kami memberikan Anda solusi optimal yang cocok untuk alur kerja pemurnian Anda.

10 Pengabdian: Penguatan Peran Lembaga Keuangan Lokal dalam Pengembangan Ekonomi Kreatif di Desa Sanur Kaja (Anggota Tim Pengabdian). Rp70.000.000 Ekonomi Fakultas