Epsilon dan sistem koordinat

Pilihan sistem koordinat Anda—dengan kata lain, pilihan Anda tentang arti 1 unit dunia—berkaitan erat dengan pilihan nilai epsilon kuas Anda. Sistem koordinat tercermin dalam nilai matriks transformasi inputToWorld yang Anda teruskan ke InProgressStrokesView.startStroke() dan transformasi serupa yang Anda terapkan ke Canvas saat menggambar goresan kering.

Aplikasi umum hanya dapat mempertimbangkan unit dunia dan membiarkan argumen strokeToWorldTransform dari startStroke() sebagai matriks identitas default.

Jika aplikasi Anda mendukung penggeseran, zoom, atau rotasi permukaan gambar, nilai pasti matriks transformasi tersebut akan berubah dari waktu ke waktu, tetapi perubahan tersebut mencerminkan perubahan cara sistem koordinat dunia Anda dilihat oleh kamera yang digunakan pengguna untuk melihat permukaan gambar.

Sistem koordinat dunia dapat dibayangkan sebagai petak dengan setiap sel berukuran satu unit dunia. Epsilon adalah ukuran dalam petak tersebut, angka floating point unit dunia.

Saat pengguna memperbesar konten Anda, mereka juga memperbesar petak unit dunia, sehingga pilihan unit dunia dan ukuran epsilon dalam hal tingkat zoom default 100% menjadi penting.

Definisi ukuran unit dunia dan nilai epsilon dalam unit dunia harus berupa nilai tetap selama masa aktif aplikasi Anda.

Implementasi internal menggunakan epsilon untuk menentukan seberapa dekat dua titik harus satu sama lain agar dianggap sebagai titik yang sama. Dengan kata lain, jarak apa pun yang kurang dari epsilon dianggap sebagai jarak nol. Nilai ini digunakan untuk menguantisasi dan membulatkan penghitungan internal.

Berapa ukuran unit dunia dan nilai epsilon yang wajar?

Untuk portabilitas di berbagai ukuran layar dan kepadatan perangkat, ukuran unit dunia harus independen terhadap kepadatan. Unit klasik untuk skenario tersebut adalah piksel kepadatan mandiri (dp). Biasanya pilih 1 dp sebagai ukuran unit dunia Anda.

Saat memilih nilai epsilon tetap, hindari pembulatan implementasi internal angka ke jarak yang lebih besar dari satu piksel. Dengan ukuran unit dunia 1 dp, epsilon harus paling banyak 1/4 (0,25 unit dunia) agar berukuran piksel pada perangkat dengan kepadatan tampilan tinggi yang 1 dp-nya bisa 4 px. Namun, jika Anda ingin mendukung pengguna memperbesar konten mereka hingga 10x dan tetap menjaga pembulatan terkait epsilon hingga 1 px atau kurang, maka epsilon harus 0,25 dibagi 10, yang sama dengan 0,025 unit dunia.

Ini tidak berarti Anda tidak dapat memperbesar lebih dari 10x, tetapi Anda mungkin mulai melihat beberapa ketidakakuratan dan artefak dalam rendering goresan pada titik tersebut.

Memilih nilai epsilon adalah keseimbangan antara detail yang presisi saat memperbesar dan resource komputasi seperti:

  • Siklus CPU untuk menghitung geometri yang lebih presisi
  • Memori untuk menyimpan lebih banyak detail dalam geometri tersebut
  • Waktu GPU untuk merender geometri tersebut

Panduan ini adalah nilai default yang wajar, tetapi Anda dapat menggunakannya untuk memilih sistem koordinat dan nilai epsilon yang lebih sesuai dengan kebutuhan Anda.

Terlalu jauh menyimpang dari nilai yang direkomendasikan ini dapat memengaruhi aplikasi Anda secara negatif. Misalnya, peningkatan konsumsi resource dapat membuat aplikasi Anda berjalan lambat. Dalam beberapa kasus, masalah presisi floating point juga dapat terlihat sebagai artefak visual yang aneh.