Panduan visual mendalam tentang bagaimana komputer menentukan objek mana yang akan digambar dan mana yang dibuang.
Click here for English
Dalam grafika komputer, Clipping (pemotongan) adalah proses menentukan bagian mana dari sebuah objek geometri (seperti titik, garis, atau poligon) yang berada di dalam area pandang (viewport) dan membuang sisanya. Ini sangat penting untuk optimasi kinerja—mengapa menghitung piksel untuk objek yang tidak bisa dilihat pengguna?
Algoritma paling populer untuk memotong garis. Algoritma ini menggunakan kode wilayah 4-bit (region code) untuk dengan cepat menentukan apakah garis sepenuhnya di dalam, di luar, atau perlu dipotong.
Layar dibagi menjadi 9 wilayah menggunakan 4 bit: Atas, Bawah, Kanan, Kiri.
0000.const INSIDE = 0; // 0000
const LEFT = 1; // 0001
const RIGHT = 2; // 0010
const BOTTOM = 4; // 0100
const TOP = 8; // 1000
function hitungKode(x, y) {
let code = INSIDE;
// Menentukan posisi bit
if (x < xmin) code |= LEFT;
else if (x > xmax) code |= RIGHT;
if (y < ymin) code |= BOTTOM;
else if (y > ymax) code |= TOP;
return code;
}
Klik tombol di bawah untuk membuat garis acak. Abu-abu adalah bagian asli yang dibuang, Hijau adalah hasil clipping yang diterima.
Algoritma yang lebih efisien dibandingkan Cohen-Sutherland karena menggunakan persamaan parametrik. Algoritma ini menghindari operasi pembagian berulang yang berat secara komputasi.
Garis didefinisikan sebagai $P(t) = P_1 + t(P_2 - P_1)$ dimana $0 \le t \le 1$.
Kita menyelesaikan pertidaksamaan $p_k \cdot t \le q_k$.
function clipLineLB(x1, y1, x2, y2) {
let t0 = 0, t1 = 1; // t awal & akhir
let dx = x2 - x1, dy = y2 - y1;
// Cek 4 batas (hitung p & q)
// Update t0 (maksimum dari t masuk)
// Update t1 (minimum dari t keluar)
if(t0 > t1) return null; // Tolak
// Hitung koordinat baru berdasarkan t
nx1 = x1 + t0 * dx;
ny1 = y1 + t0 * dy;
// ... dst
}
Garis Biru adalah hasil perhitungan parametrik.
Memotong poligon lebih rumit karena memotong poligon cembung (convex) dapat menghasilkan lebih banyak titik sudut (vertex) daripada aslinya. Algoritma ini memotong seluruh poligon terhadap satu tepi jendela pada satu waktu.
Output dari satu tahap pemotongan menjadi input untuk tahap berikutnya.
for each sisiClip di Window:
outputList = []
for each vertex di inputList:
curr = vertex
prev = previousVertex
if (Dlm -> Dlm) tambah curr
if (Dlm -> Luar) tambah potong
if (Luar -> Dlm) tambah potong, curr
if (Luar -> Luar) abaikan
inputList = outputList
Bentuk Abu-abu adalah poligon asli. Bentuk Pink adalah hasil setelah dipotong kotak hitam.