Hasilkan area berukuran sama dalam poligon

8

Saya mencari logika kode semu yang akan menemukan narea berukuran sama dalam poligon yang diberikan. Tidak boleh ada ruang di antara atau di luar area yang cocok. Pencocokan area yang valid pertama harus dikembalikan.

Dengan asumsi poligon berikut [2,2, 3,1, 5,1, 5,4, 4,5, 2,3]sebagai input:

masukkan deskripsi gambar di sini

... dan 3sebagai parameter, output yang valid dapat berupa [ [2,2, 3,2, 3,3, 4,3, 4,5, 2,3], [2,2, 3,1, 5,1, 4,2, 4,3, 3,3, 3,2], [4,5, 4,2, 5,1, 5,4] ]:

masukkan deskripsi gambar di sini

Output lain yang valid dengan parameter 3adalah [ [3,4, 3,3, 4,3, 4,2, 3,2, 3,1, 2,2, 2,3], [4,3, 4,2, 3,2, 3,1, 5,1, 5,3], [3,4, 3,3, 5,3, 5,4, 4,5] ]:

masukkan deskripsi gambar di sini

Harap perhatikan bahwa area tidak harus berbagi titik pusat yang sama. Satu atau beberapa area mungkin jatuh tepat di antara area lain di dalam poligon.

Berikut adalah contoh input / output sampel lainnya.

Dengan asumsi poligon berikut [1,3, 1,1, 7,1, 7,2, 8,2, 8,3, 5,6, 4,6]sebagai input:

masukkan deskripsi gambar di sini

..dan 5sebagai parameter, output yang valid dapat [ [1,3, 1,1, 3,1, 3,2, 4,3, 3,4, 3,3], [3,2, 3,1, 7,1, 7,2, 6,2, 6,3, 5,3, 5,2], [6,2, 8,2, 8,3, 6,5, 5,5, 5,4, 6,4], [1,3, 3,3, 3,4, 5,5, 6,4, 6,5, 7,5, 6,6, 5,6], [3,4, 4,3, 3,2, 5,2, 5,3, 6,3, 6,4, 5,4, 4,5] ]:

masukkan deskripsi gambar di sini

Asumsi berikut dibuat:

  • arah semua batas dapat dibagi dengan 45

  • koordinat integer digunakan untuk semua poligon

  • area integer dari input poligon selalu habis dibagi n

  • semua poligon dapat berupa cembung atau cekung yang

  • dipecahkan, nbidang-bidang yang berarti dapat masuk dengan benar ke dalam poligon yang diberikan

Sergey Lukin
sumber
1
Berbagi penelitian Anda membantu semua orang . Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling penting itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
Maksud Anda area "berukuran sama", bukan "merata", saya kira?
Doc Brown
@DocBrown kamu begitu benar, aku tahu aku akan mendapatkan sesuatu yang salah di sini. Maksud saya berukuran sama. Diperbaiki
Sergey Lukin
Apakah poligon input Anda selalu cembung, seperti pada contoh Anda?
Doc Brown
@DocBrown Format apa pun akan berfungsi dengan baik, saya hanya memilih format ini karena saya melihatnya di suatu tempat dan menebak itu yang utama, tetapi saya ingin diperbaiki.
Sergey Lukin

Jawaban:

6

Tidak bisa dipecahkan. Saya mencoba sejumlah metode sampai saya menyadari itu tidak dapat dilakukan.

Asumsikan bentuk dengan area 4, yang harus dibagi dalam 2 bagian dengan area 2 masing-masing:

kotak

Segitiga dan kuadrat paling kiri harus menjadi bagian dari bentuk 1, tetapi membutuhkan segitiga lain. Satu-satunya tempat yang bisa diambil adalah kuadrat ke kanan, tetapi sisanya dibagi menjadi dua wilayah.

NiklasJ
sumber
2
Tidak dipecahkan secara umum tentu saja, tapi saya kira OP bisa tertarik dalam algoritma yang memecahkan masalah untuk setiap kasus di mana hal itu dapat diatasi, dan sebaliknya output yang tidak bisa diselesaikan ;-) Memberi Anda upvote, baik.
Doc Brown
Tangkapan yang bagus. Saya tidak memikirkannya. Kita dapat menambahkan asumsi bahwa area valid selama itu terdiri dari koordinat jalur yang tidak dicegat oleh area lain yang akan menghasilkan [ [0,1, 2,1, 2,2, 3,2, 2,3, 2,2 1,2], [2,2, 2,0, 3,0, 3,2] ] salah satu menerima fakta bahwa pengecualian dilemparkan seandainya fungsi iterated pada semua varian dan tidak menemukan pertandingan. Bagaimana menurut anda?
Sergey Lukin
Demi kesederhanaan, saya telah menambahkan asumsi bahwa hanya variasi poligon yang dapat dipecahkan dan jumlah area yang dilewatkan sebagai input. Lihat hasil edit saya. Terima kasih
Sergey Lukin
6

Seperti yang saya katakan dalam komentar saya untuk Doc Browns (jika tidak luar biasa) jawaban, ada masalah pilihan kuadrat> pembagian segitiga yang membuatnya sedikit lebih sulit untuk perangkat algoritma. Juga, Anda tidak harus membuatnya secara serial, tetapi dapat melakukannya secara paralel, seperti yang ditunjukkan oleh beberapa saran saya.

Saya membuat beberapa pendekatan heuristik pada awalnya.

Voronoi: Pilih N poin (koordinat non-integer) dalam bentuk, buat peta voronoi. Biarkan poin menarik dan saling tolak sehubungan dengan area mereka (terlalu besar menarik, terlalu kecil menolak).

Berguna untuk A / N besar, mudah jatuh ke maxima lokal.

Metode lingkaran: Tujuannya adalah untuk menghapus area yang bermasalah, dan kemudian melanjutkan menggunakan metode lain.

Pilih titik (non-integer) di bagian dalam, dan jari-jari r. Interior minus lingkaran akan membuat k subregional terputus. Jika salah satu subregional berukuran A / n, hapuslah. Juga, jika ada 2 * A / n, itu harus mudah dibagi, dan hapus juga. Turunkan jari-jari sedikit, dan lanjutkan (mungkin gunakan beberapa pencarian biner).

Pertumbuhan titik bermasalah: Mulailah menggunakan metode Doc Brown menyebutkan, tetapi karena ada dua pilihan paling banyak tepi, lewati grafik dan tumbuhkan setiap wilayah di perbatasan dengan cara membuat poin bermasalah sesedikit mungkin (poin bermasalah = segitiga saja) berbagi satu sisi dengan sisa bentuk). Misalnya ketika memilih tetangga baru untuk dimasukkan, tambahkan mereka dalam urutan cembung (cekung = cembung negatif)

Pertumbuhan pita: Untuk area yang hampir cembung atau cembung. Pilih titik di tepi luar, buat pita lebar satuan ikuti tepi luar sampai panjangnya pas, pastikan untuk tidak pernah membuat titik terputus baru. Jika perlu, lewati segitiga terakhir dan membuatnya tumbuh sedikit lebarnya. Biarkan pita berikutnya mengikuti di mana yang terakhir berakhir sampai area terakhir dengan ukuran yang tepat.

Seperti permainan atau organik: Buat N "negara". Tempatkan mereka di tempat-tempat acak. Biarkan mereka tumbuh secara organik. Ketika mereka bertemu satu sama lain, yang memiliki area terkecil saat ini adalah yang terkuat dan memenangkan segitiga. Mungkin rentan terhadap maxima lokal?

NiklasJ
sumber
3

Strategi umum harus menghapus bagian pertama area A / n dari poligon P0 Anda (di mana A adalah total area), meninggalkan Anda dengan P1 poligon baru area AA / n. Kemudian ulangi ini menghasilkan P2 poligon, kemudian P3, dan setelah pengulangan, Anda memiliki solusi Anda. Perhatikan bahwa dimungkinkan pada setiap langkah bahwa Anda tidak dapat menemukan bagian baru di mana bagian yang tersisa masih membentuk poligon yang terhubung, di mana Anda harus mundur satu langkah dan mencoba menemukan bagian lain, atau menghentikan algoritme tanpa hasil .

Untuk membuat potongan ukuran A / n tersebut, mulailah dengan membagi poligon Anda menjadi "potongan-potongan kotak". Setiap kotak persegi di dalam poligon membentuk potongan seperti itu, serta setiap segitiga berbentuk setengah-persegi di mana perbatasan poligon membagi persegi menjadi dua setengah. Anda dapat menggunakan tes point-in-polygon untuk ini, lakukan iterasi pada semua setengah kotak di dalam kotak pembatas poligon dan uji jika titik tengahnya berada di dalam poligon yang diberikan (jika kedua setengah dari sebuah persegi terkandung, seseorang dapat menggunakan persegi penuh sebagai gantinya). Selanjutnya, Anda membuat grafik planar, di mana masing-masing bagian mendefinisikan simpul (dengan "area" atau "berat" dari 1 atau 1/2). Tepi-tepi grafik itu diberikan oleh potongan-potongan yang bertetangga. Ini mengurangi masalah geometrik Anda menjadi masalah grafik, di mana Anda mencari sub-grafik yang terhubung dengan simpul dari bobot total A / n, dan grafik yang tersisa masih terhubung .

Masalah yang terakhir mungkin bisa diselesaikan dengan backtrackingpendekatan. Mulailah dengan satu simpul yang dapat dihapus dari grafik tanpa membuatnya tidak terhubung. Anda dapat memilih simpul secara acak, jika Anda suka, atau mengacak daftar semua simpul secara acak satu kali, untuk digunakan kembali dalam langkah-langkah berikut. Sekarang cobalah untuk menemukan simpul kedua yang terhubung ke yang pertama, yang dapat dihapus dari grafik yang tersisa tanpa merusak keterhubungannya juga. Jika ada beberapa kemungkinan, pilih satu secara acak. Untuk simpul yang mewakili kotak, Anda juga dapat mengizinkan operasi grafik di mana Anda membagi persegi menjadi dua segitiga (ini menciptakan simpul baru dengan bobot 1/2) dengan salah satu atau cara lain yang mungkin. Ini hanya sedikit lebih rumit daripada hanya memindahkan satu simpul dari grafik asli ke sub-grafik, tetapi seharusnya tidak terlalu sulit sama sekali.

Ulangi itu sampai subgraph Anda mencapai berat total A / n, atau Anda tidak menemukan simpul lain. Jika demikian, "mundur" satu tingkat dan coba simpul yang berbeda terlebih dahulu.

Ada beberapa cara untuk mengoptimalkan ini, misalnya, Anda harus memilih tes konektivitas cepat untuk grafik. Saya kira Anda akan menemukan banyak algoritma untuk sub masalah ini, gunakan Google, atau mulai di sini . Mungkin perlu mencari algoritma yang dapat dengan cepat memverifikasi jika grafik yang terhubung masih terhubung ketika satu titik dihapus.

Semoga ini membantu.

Doc Brown
sumber
Ini terdengar persis seperti yang saya butuhkan. Saya telah membayangkan strategi ini dalam teori dan sejauh ini masuk akal bagi saya, sekarang saatnya bagi saya untuk menerapkannya. Saya akan melaporkan kembali ketika saya memiliki sesuatu untuk ditampilkan. Terima kasih banyak!
Sergey Lukin
Saya pikir ada sedikit masalah dengan pendekatan ini. Untuk setiap kotak, ada dua pilihan segitiga yang memungkinkan. Untuk benar-benar memeriksa semuanya dan menjamin solusi jika ada, saya kira Anda harus melakukannya untuk semua pilihan.
NiklasJ
@ NiklasJ: Anda benar, lihat jawaban saya yang ditingkatkan yang memperhitungkan ini.
Doc Brown
@SergeyLukin: Saya sedikit mengubah jawaban saya untuk mempertimbangkan komentar NiklasJ.
Doc Brown