Berikut adalah peta kontur yang tersedia untuk semua poligon levelnya.
Mari kita tanyakan bagaimana cara menghaluskan poligon menjaga semua simpul dipertahankan di lokasi yang tepat?
Memang kontur dibuat di atas data kisi, Anda dapat menyarankan untuk memuluskan data kisi dan karenanya kontur yang dihasilkan akan lebih halus. Perhatikan bahwa ini tidak berfungsi sesuai keinginan saya karena fungsi penghalusan seperti filter Gaussian akan menghapus paket kecil data dan akan mengubah rentang variabel ketiga mis. Tinggi yang tidak diperbolehkan dalam aplikasi saya.
Sebenarnya saya sedang mencari sepotong kode (lebih disukai dengan Python ) yang dapat melakukan smoothing dari poligon 2D (semua jenis: cembung, cekung, berpotongan diri dll) cukup menyakitkan (lupa halaman kode) dan akurat.
FYI, ada fungsi di ArcGIS yang melakukan ini dengan sempurna, tetapi menggunakan aplikasi komersial pihak ketiga bukanlah pilihan saya untuk pertanyaan ini.
1)
Scipy.interpolate:
Seperti yang Anda lihat, splines yang dihasilkan (merah) tidak memuaskan!
2)
Ini hasilnya menggunakan kode yang diberikan di sini . Itu tidak berfungsi dengan baik!
3)
Bagi saya solusi terbaik haruslah sesuatu seperti gambar berikut di mana sebuah persegi sedang dihaluskan secara bertahap dengan mengubah hanya satu nilai. Saya berharap konsep serupa untuk menghaluskan segala bentuk poligon.
Memuaskan kondisi yang spline melewati poin:
4)
Ini adalah implementasi saya dari "ide ide" baris demi baris dengan Python pada datanya. Mungkin ada beberapa bug karena hasilnya tidak bagus.
K = 2 adalah bencana dan untuk k> = 4.
5)
Saya menghapus satu titik di lokasi bermasalah dan spline yang dihasilkan sekarang identik dengan milik whuber. Tetapi masih menjadi pertanyaan mengapa metode ini tidak bekerja untuk semua kasus?
6)
Perataan yang baik untuk data whuber dapat berupa sebagai berikut (digambar oleh perangkat lunak grafik vektor) di mana titik ekstra telah ditambahkan dengan lancar (bandingkan dengan pembaruan
4):
7)
Lihat hasil dari versi Python dari kode whuber untuk beberapa bentuk ikon:
Perhatikan bahwa metode ini tampaknya tidak berfungsi untuk polyline. Untuk sudut polyline (kontur) hijau adalah yang saya inginkan tetapi mendapat merah. Ini perlu diatasi karena peta kontur selalu polylines meskipun polyline tertutup dapat diperlakukan sebagai poligon seperti pada contoh saya. Juga bukan masalah yang muncul di pembaruan 4 belum diatasi.
8) [yang terakhir]
Inilah solusi terakhir (tidak sempurna!):
Ingatlah bahwa Anda harus melakukan sesuatu tentang area yang ditunjukkan oleh bintang. Mungkin ada bug dalam kode saya atau metode yang diusulkan perlu pengembangan lebih lanjut untuk mempertimbangkan semua situasi dan untuk memberikan hasil yang diinginkan.
Jawaban:
Sebagian besar metode untuk spline urutan angka akan spline poligon. Caranya adalah membuat splines "menutup" dengan lancar di titik akhir. Untuk melakukan ini, "bungkus" simpul di sekitar ujungnya. Kemudian spline koordinat x dan y secara terpisah.
Berikut adalah contoh yang berfungsi di
R
. Ini menggunakanspline
prosedur kubik default yang tersedia dalam paket statistik dasar. Untuk kontrol lebih banyak, gantilah hampir semua prosedur yang Anda inginkan: pastikan itu merambat melalui angka-angka (yaitu, interpolasi mereka) daripada hanya menggunakannya sebagai "titik kontrol."Untuk menggambarkan penggunaannya, mari kita buat poligon kecil (tapi rumit).
Spline menggunakan kode sebelumnya. Untuk membuat spline lebih halus, tambah jumlah simpul dari 100; untuk membuatnya kurang lancar, kurangi jumlah simpul.
Untuk melihat hasilnya, kami memplot (a) poligon asli dengan tanda hubung merah, menunjukkan celah antara simpul pertama dan terakhir (yaitu, tidak menutup polyline batasnya); dan (b) spline berwarna abu-abu, sekali lagi menunjukkan celahnya. (Karena jaraknya sangat kecil, titik akhirnya disorot dengan titik-titik biru.)
sumber
Saya tahu ini adalah posting lama, tetapi muncul di Google untuk sesuatu yang saya cari, jadi saya pikir saya akan memposting solusi saya.
Saya tidak melihat ini sebagai latihan pemasangan kurva 2D, melainkan latihan 3D. Dengan mempertimbangkan data sebagai 3D, kami dapat memastikan bahwa kurva tidak saling bersilangan, dan dapat menggunakan informasi dari kontur lain untuk meningkatkan perkiraan kami untuk yang saat ini.
Ekstrak iPython berikut menggunakan interpolasi kubik yang disediakan oleh SciPy. Perhatikan bahwa nilai z yang saya plot tidak penting, selama semua kontur sama tingginya.
Hasil di sini tidak terlihat yang terbaik, tetapi dengan begitu sedikit titik kontrol mereka masih valid sempurna. Perhatikan bagaimana garis hijau dipasang keluar untuk mengikuti kontur biru yang lebih luas.
sumber
Saya menulis hampir persis paket yang Anda cari ... tapi itu di Perl, dan lebih dari satu dekade yang lalu: GD :: Polyline . Ini menggunakan kurva Bezier 2D kubik, dan akan "memuluskan" Poligon sewenang-wenang atau "Polyline" (nama saya kemudian untuk apa yang sekarang biasa disebut "LineString").
Algoritma itu dua langkah: diberi titik di Polygon, tambahkan dua titik kontrol Bezier antara setiap titik; lalu panggil algoritma sederhana untuk membuat perkiraan sedikit demi sedikit dari spline.
Bagian kedua mudah; bagian pertama adalah sedikit seni. Berikut adalah wawasan: mempertimbangkan "control segmen" a Vertex N:
vN
. Segmen kontrol adalah tiga co-linear poin:[cNa, vN, cNb]
. Titik pusat adalah titik. Kemiringan seg kontrol ini sama dengan kemiringan dari Vertex N-1 ke Vertex N + 1. Panjang bagian kiri segmen ini adalah 1/3 panjang dari Vertex N-1 ke Vertex N, dan panjang bagian kanan segmen ini adalah 1/3 panjang dari Vertex N ke Vertex N +1.Jika kurva asli empat simpul:
[v1, v2, v3, v4]
maka setiap sudut sekarang mendapatkan segmen kontrol dalam bentuk:[c2a, v2, c2b]
. Rangkai semuanya seperti ini:[v1, c1b, c2a, v2, c2b, c3a, v3, c3b, c4a, v4]
dan kukus empat sekaligus sebagai empat poin Bezier:,[v1, c1b, c2a, v2]
lalu[v2, c2b, c3a, v3]
, dan seterusnya. Karena[c2a, v2, c2b]
bersifat co-linear, kurva yang dihasilkan akan halus di setiap dhuwur.Jadi ini juga memenuhi persyaratan Anda untuk parameter "keketatan" kurva: gunakan nilai yang lebih kecil dari 1/3 untuk kurva "lebih ketat", yang lebih besar untuk cocok "loopier". Dalam kedua kasus, kurva yang dihasilkan selalu melewati titik-titik asli yang diberikan.
Ini menghasilkan kurva halus yang "membatasi" Polygon asli. Saya juga punya beberapa cara untuk "menuliskan" kurva yang halus ... tapi saya tidak melihatnya dalam kode CPAN.
Lagi pula, saya saat ini tidak memiliki versi yang tersedia dalam Python, saya juga tidak memiliki angka. TAPI ... jika / ketika saya melakukan port ini ke Python, saya pasti akan memposting di sini.
sumber