Bukannya ini tidak masuk akal, tetapi hanya berhasil 99% dari waktu canggung.
Seringkali dalam grafik 2D persegi panjang diinisialisasi, disimpan dan dimanipulasi sebagai sepasang titik. Dalam bahasa tertentu,
class Rect:
p1, p2: point
Lebih masuk akal untuk mendefinisikan persegi panjang sebagai dua nilai x dan dua nilai y, seperti ini:
class Rect
xleft, xright: int
ytop, ybottom: int
Dengan dua poin, jika di suatu tempat dalam kode sumber Anda ingin memanfaatkan nilai y dari atas, Anda harus mengatakan rect.p1.y (hmmm, berhenti dan pikirkan, apakah p1 atau p2) tetapi dengan empat nilai sebagai anggota data biasa, itu jelas dan langsung: rect.ytop (tidak perlu berpikir!) Penggunaan dua titik berarti bahwa dalam berurusan dengan vertikal, Anda harus kusut horizontal; ada hubungan yang asing antara unsur-unsur independen.
Bagaimana gagasan dua poin ini muncul dan mengapa itu bertahan? Apakah ada kelebihan dibandingkan koordinat bare x dan y?
CATATAN TAMBAHAN: Pertanyaan ini dalam konteks persegi panjang yang disejajarkan XY, seperti pada manajer jendela dan perangkat GUI, bukan dalam konteks bentuk sewenang-wenang dalam menggambar dan melukis aplikasi.
Jawaban:
Sudahkah Anda menganggap itu lebih rentan kesalahan?
Jika Anda menggunakan (Point1, Point2) maka sangat jelas apa yang Anda tentukan. Jika Anda memberikan 2 poin, maka satu-satunya kesalahan yang mungkin adalah bahwa pengguna telah mencampur x dan y mereka ketika membangun poin karena urutan poin tidak masalah.
Jika Anda memberikan 4 bilangan bulat, maka jika seseorang tidak memperhatikan, mereka dapat memasok (x1, x2, y1, y2) ketika Anda inginkan (x1, y1, x2, y2) atau sebaliknya. Juga, beberapa API seperti struktur Rect WCF mendefinisikan persegi panjang sebagai (x, y, lebar, tinggi) yang kemudian dapat menyebabkan kebingungan tentang apa artinya (1, 2, 3, 4) artinya. Apakah itu (x, y, w, h) atau (x1, y1, x2, y2) atau (x1, x2, y1, y2)?
Secara keseluruhan, (Point1, Point2) tampaknya sedikit lebih aman bagi saya.
sumber
Saya selalu suka mendefinisikan persegi panjang sebagai titik + lebar dan tinggi, di mana titik adalah sudut kiri atas persegi panjang.
Dan kemudian tambahkan metode apa pun yang Anda butuhkan untuk mengambil metrik lainnya. Seperti versi Java
sumber
Sebenarnya, seekor elang tidak ditentukan oleh 2 poin. Sebuah persegi panjang hanya dapat didefinisikan oleh dua titik jika sejajar dengan sumbu.
Ada beberapa cara untuk mewakili persegi panjang yang sejajar dengan sumbu:
Untuk (1), banyak perpustakaan menggunakan konvensi untuk menentukan dua titik mana yang digunakan - topLeft dan bottomRight, misalnya.
Pilihan representasi mungkin didorong oleh tujuan asli dari definisi persegi panjang, tetapi saya membayangkan bahwa itu sering sewenang-wenang . Representasi tersebut setara dalam informasi yang dibawanya. Namun, mereka berbeda dalam kemudahan yang sifat-sifat persegi panjang dapat dihitung dan kenyamanan yang dengannya operasi dapat dilakukan pada reektangle.
Manfaat definisi (1) dibandingkan yang lain meliputi:
sumber
Nah
p1: Point
danp2: Point
masing-masing akan memiliki duaint
koordinat di dalamnya, jadi bukankah kelas Anda sama dengan hal yang sama?Dan jika Anda menyimpan kedua titik itu sebagai
Point
objek kelas satu , tidakkah Anda mendapat sedikit lebih banyak utilitas dari mereka? Dalam sebagian besar sistem koordinat grafis yang saya ketahui, poin disubklasifikasikan dengan cara ini untuk membuat hierarki objek:point -> circle -> ellipse
dan seterusnya.Jadi jika Anda membuat objek yang tidak menggunakan
Point
kelas, Anda telah menceraikan objek itu dari sisa hierarki kelas.sumber
ytop
/ybottom
, perlu ada jaminan di suatu tempat yangybottom
sebenarnya di bawah iniytop
.Ini sebabnya saya suka Delphi
TRect
. Ini didefinisikan sebagai rekaman varian (struct serikat dalam bahasa-C) yang dapat diartikan sebagai TopLeft dan titik BottomRight, atau bilangan bulat Atas, Kiri, Bawah dan Kanan, mana yang lebih nyaman saat ini.sumber
Tentunya jika Anda mendefinisikan persegi panjang Anda sebagai:
maka Anda langsung tahu titik mana yang mana.
Yang lebih baik adalah menambahkan properti tambahan yang memungkinkan Anda untuk memanipulasi persegi panjang di mana cara yang Anda butuhkan untuk aplikasi Anda. Ini hanya akan memperbarui struktur data yang mendasarinya.
Dengan menambahkan transformasi ke bentuk, Anda bisa mengarahkan persegi panjang Anda dengan cara apa pun yang Anda inginkan. Anda masih membutuhkan kotak pembatas yang disejajarkan dengan sumbu untuk menerima cepat / menolak cek :)
Namun, jika model Anda memungkinkan persegi panjang dalam orientasi apa pun tanpa menerapkan transformasi maka "kiri bawah" dan "kanan atas" tidak memiliki makna, yang mengarah kembali ke "p1" dan "p2" (atau sesuatu yang setara).
sumber
saya pikir lebih masuk akal untuk sebuah persegi panjang untuk diwakili oleh x dan y sejauh dan titik; Anda bahkan dapat membuat titik lokasi pusat persegi panjang sehingga tidak tergantung pada rotasi
tapi itu mungkin paling mudah untuk mengkodekannya sebagai dua poin!
sumber
Saya tidak suka karena kami telah membuang tingkat kebebasan potensial, yang pada dasarnya memungkinkan untuk rotasi sewenang-wenang. Persegi panjang 2D umum memiliki lima yang tidak diketahui (derajat kebebasan). Kita dapat menetapkannya sebagai koordinat titik, panjang kedua sisi yang membentuk titik dengan titik ini, dan sudut dari garis horizontal garis pertama (yang lain diasumsikan memiliki sudut 90 derajat lebih besar). Jumlah tak terbatas dari kemungkinan lain juga dapat digunakan, tetapi ada lima jumlah independen yang harus ditentukan. Beberapa pilihan akan mengarah ke aljabar yang lebih mudah daripada yang lain, tergantung pada apa yang dilakukan dengannya.
sumber
Bukankah itu persis sama dengan 2 poin? Bagaimana ini canggung ... sebagian besar rutinitas menggambar memerlukan poin, bukan komponen x / y yang terpisah.
sumber
Mendefinisikan persegi panjang sebagai pasangan titik memungkinkan Anda menggunakan kembali titik tersebut sebagai simpul untuk bentuk lain. Hanya pemikiran saja...
sumber
Saya percaya ini terutama untuk membangun keseragaman antara semua bentuk primitif.
Tentu Anda bisa mendefinisikan persegi panjang dengan banyak cara berbeda, tetapi bagaimana Anda mendefinisikan segitiga, atau bintang, atau lingkaran dengan cara yang dapat menggunakan struktur data serupa?
Semua poligon dapat didefinisikan oleh poin-poinnya, dengan logika singkat untuk menentukan apa yang harus dilakukan dengan poin-poin tersebut.
Pustaka grafis terutama beroperasi pada poligon ini dalam hal simpul dan tepi, sehingga titik dan garis di antara mereka, semua perhitungan bekerja pada dua fitur ini, baik itu dan sisi, tetapi itu sendiri hanyalah fungsi dari tepi.
sumber
Dalam dua dimensi, menyimpan persegi panjang sebagai dua titik lebih jelas daripada mendefinisikan sudut tertentu dan lebar dan tinggi - pertimbangkan lebar atau tinggi negatif, atau perhitungan yang diperlukan untuk menentukan setiap opsi dari yang lain.
Melakukan rotasi pada persegi panjang yang ditentukan oleh titik juga jauh lebih sederhana daripada yang didefinisikan dengan titik plus lebar dan tinggi.
Saya berharap enkapsulasi membuat diferensiasi ini tidak penting sebagai pengguna kelas.
Sebuah persegi panjang harus didefinisikan sebagai tiga titik yang harus didefinisikan dengan baik dalam 3 dimensi. Saya tidak sepenuhnya yakin tentang persyaratan untuk mendefinisikan sebuah persegi panjang dalam 4 atau lebih dimensi.
sumber
Ini sepenuhnya sewenang-wenang. Anda memerlukan empat bagian informasi untuk menggambar persegi panjang. Perancang perpustakaan memutuskan untuk mewakilinya dengan dua poin (masing-masing dengan koordinat xy), tetapi bisa dengan mudah melakukannya dengan x / y / w / h atau atas / bawah / kiri / kanan.
Saya kira pertanyaan sebenarnya OP adalah: mengapa pilihan khusus ini dibuat?
sumber
Pilihan parameter hanya penting bagi desainer / coders tingkat rendah.
Pengguna tingkat tinggi hanya perlu memikirkan:
Catatan: Untuk meminimalkan kehilangan presisi selama transformasi penskalaan, kadang-kadang tepat untuk menerapkan kelas Rect kedua yang menggunakan koordinat titik-mengambang, sehingga hasil antara dapat disimpan secara akurat dalam urutan transformasi dan hanya dibulatkan ke bilangan bulat di langkah terakhir.
sumber
Seperti @teven mengatakan, saya pikir itu harus dalam hal satu (x, y) titik, dan vektor ukuran (w, h). Itu karena mudah jatuh ke dalam ambiguitas. Misalkan Anda memiliki persegi panjang terisi berikut mulai dari titik (0,0).
Jelas itu lebar, tinggi adalah (3,3), tapi apa itu poin kedua? Apakah (2,2) atau (3,3)?
Ambiguitas ini dapat menyebabkan semua jenis masalah.
Saya belajar dengan cara yang keras tahun yang lalu bahwa lebih baik untuk memikirkan koordinat grafis sebagai garis antara piksel, bukan sebagai garis piksel yang di . Dengan begitu tidak ada ambiguitas.
sumber
Kita dapat mendefinisikan kedua Pb & Pc dengan demikian:
dan
Jadi tidak perlu mendefinisikan keempat poin karena simetri
sumber