mengisi poligon bujursangkar dengan persegi panjang [duplikat]

Diberikan sebuah poligon, dibuat seluruhnya dari persegi panjang, dan ditentukan oleh serangkaian titik, yang ujung-ujungnya selalu sejajar dengan sumbu:

poligon yang seluruhnya dibuat dari persegi panjang yang berpotongan

Saya mencoba menentukan algoritma cepat untuk menemukan sejumlah kecil persegi panjang yang dapat mengisi bentuk ini. Ini adalah sesuatu yang saya lakukan dengan tangan untuk menunjukkan kumpulan persegi panjang yang saya jelaskan:poligon yang seluruhnya dibuat dari persegi panjang berpotongan yang diisi dengan  persegi panjang yang tidak tumpang tindih

EDIT: Berikut adalah beberapa kode pemrosesan sederhana untuk membuat bentuk ini (hampir saja).

float[] xpts = {0,    50,  50,  100, 100, 150, 150, 250, 250, 300, 300, 325, 325, 300, 300, 250, 250, 210, 210, 250, 250, 125, 125, 25, 25,   50,  50,  0 };
float[] ypts = {100, 100,  80,   80, 10,   10,  80, 80,  75,  75, 80,   80,  200, 200, 300, 300, 275, 275, 260, 260, 200, 200, 270, 270, 165, 165, 125, 125};


void setup( )
{
  size( 350, 350 );
}

void draw( )
{

stroke( 0 );
strokeWeight( 1.5 );

float px = xpts[0];
float py = ypts[0];
for (int i=1; i < xpts.length; i++)
{
  float nx = xpts[i];
  float ny = ypts[i];
  line( px, py, nx, ny );


  px = xpts[i];
  py = ypts[i];
}
float nx = xpts[0];
float ny = ypts[0];

line( px, py, nx, ny );
}

person jedierikb    schedule 03.05.2011    source sumber
comment
Apakah ujung-ujungnya selalu sejajar sumbunya? Anda dapat menggunakan garis pindai untuk menemukan area terluas dengan mudah jika memang demikian.   -  person Flexo    schedule 04.05.2011
comment
Ya, ujung-ujungnya selalu sejajar sumbu (saya akan memperbarui postingan). Bisakah Anda memberikan detail lebih lanjut tentang pendekatan garis pindai? Terima kasih.   -  person jedierikb    schedule 04.05.2011
comment
@finnw - Saya rasa ini cukup berbeda dari pertanyaan itu - di sini masukannya adalah daftar tepi.   -  person Flexo    schedule 04.05.2011
comment


Jawaban (2)


Bangun KD-Tree menggunakan tepi yang ada sebagai bidang pemisah dan abaikan wilayah yang sepenuhnya berada di luar poligon selama rekursi. Node daun kemudian akan membentuk dekomposisi persegi panjang.

Mendapatkan dekomposisi yang baik hanyalah soal splitter mana yang harus dipilih di setiap langkah rekursi. Anda mungkin ingin menggunakan heuristik sederhana yang membagi dua area yang tersisa di setiap langkah. Jika mau, Anda juga dapat mencoba beberapa splitter yang berbeda!

Berikut beberapa kode semu:

function makeRects(Rect r, Polygon p)

  if p is empty
    if r is inside your original polygon
      add r to results

  else
    choose good splitter s

    makeRects(left part of r relative to s, left part of p relative to s)
    makeRects(right part of r relative to s, right part of p relative to s)

Pemisah untuk dekomposisi sampel OP

person ltjax    schedule 06.05.2011
comment
Bisakah Anda memberi contoh? Saya tidak begitu jelas tentang bagaimana anak-anak dari setiap perpecahan didefinisikan. - person Null Set; 06.05.2011
comment
Selesai - semoga membantu. Anak-anak dari setiap pemisahan hanyalah subruang yang tersisa. Yaitu. dua bagian bidang pemisah berpotongan dengan subruang yang terkait dengan simpul induk. - person ltjax; 08.05.2011
comment
Beberapa kode semu (bisa jadi tingkat yang sangat tinggi) akan membantu untuk memahami cara mengoperasionalkan saran Anda. Terima kasih banyak. - person jedierikb; 20.05.2011
comment
Menambahkan beberapa kode semu, seperti yang Anda minta. Itu meninggalkan banyak kebebasan. Misalnya, Anda tidak perlu menguji secara eksplisit apakah r ada di dalam poligon asli untuk memutus rekursi: Anda biasanya dapat memperolehnya dari bidang pemisah satu tingkat di atasnya! - person ltjax; 20.05.2011
comment
Saya mengerti. Terima kasih. Tapi bukankah bagian kiri dari p relatif terhadap s merupakan operasi yang agak mahal? Saya mengerti bahwa semakin murah p dipangkas, tetapi masih banyak pemeriksaan poin, bukan? - person jedierikb; 20.05.2011
comment
Ini harus linier, jika Anda menerapkannya secara naif. Tapi meski begitu, prosesnya harusnya cukup cepat, jadi saya tidak akan terlalu mengkhawatirkannya. - person ltjax; 20.05.2011

Kedengarannya seperti masalah NP bagi saya. Artinya, pasti ada beberapa algoritme yang dapat dengan cepat mengisi bentuk Anda dengan persegi panjang, jika jumlah persegi panjang tidak terlalu penting bagi Anda, namun jika Anda bersikeras pada angka terkecil , maka sebaiknya lupakan kata "cepat". Sebenarnya Anda bahkan harus melupakan kata "terkecil" dan sebagai gantinya menggunakan "kecil", karena menentukan apakah himpunannya terkecil sudah bisa menjadi masalah besar bagi algoritme.

person Mecki    schedule 04.05.2011
comment
Yang terkecil diubah menjadi kecil. Terima kasih! - person jedierikb; 06.05.2011
comment
dapatkah Anda membuat sketsa bukti mengapa ini NP? - person citykid; 19.06.2014
comment
@citykid Sekarang pertanyaannya kecil, ini bukan masalah NP lagi, tapi aslinya terbaca paling kecil. Tunjukkan pada saya tes matematika untuk memverifikasi bahwa solusi terkecil dan berjalan dalam waktu polinomial. Saya tidak tahu satu pun, jadi memverifikasi solusi terkecil sudah menjadi masalah NP dan menemukan solusi terkecil juga merupakan NP. Hal ini mirip dengan masalah penjual keliling atau ransel - menemukan solusi yang baik dalam waktu singkat adalah mungkin, tetapi menemukan solusi yang tepat adalah NP. - person Mecki; 20.06.2014
comment
bagus sekali, setuju, cukup ransel. - person citykid; 21.06.2014
comment
Hai, terima kasih atas pertanyaan ini. Saya membuat grafiknya dan mereduksinya dengan algoritma hopcork dan karp. Anda bahkan hanya dapat mempersingkat langkah ini dengan hanya menggambar garis potong hanya untuk mengubah poligon (ortogon) dalam satu set persegi panjang. Hasilnya, Anda mungkin mendapatkan lebih banyak persegi panjang daripada jumlah persegi panjang yang paling sedikit, tetapi hal ini sering kali tidak menjadi masalah besar. Nah, jika Anda memperlakukan ribuan ortogon kecil di aplikasi yang aneh mungkin. Masalahnya sekarang bagi saya adalah saya tidak dapat mengisi persegi panjang setelah saya menggambarnya. Saya kesulitan memahami algoritma yang diusulkan. Contohnya di suatu tempat? terima kasih. - person Jean-Yves DANIEL; 06.04.2021