Saya memiliki objek ruang yang ditentukan oleh kumpulan segmen garis perulangan yang perlu saya perhitungkan luasnya. Kelas-kelas dapat dijelaskan sebagai berikut (dalam pseudo-code):
class Point {
float x;
float y;
...
float distanceFrom(Point p);
}
class Segment {
Point start;
Point end;
...
float length();
}
class Room {
List<Segment> walls;
...
float area();
}
Dinding-dinding sebuah ruangan tidak pernah bisa berpotongan di mana pun, tetapi pada titik akhir segmen dan "sub-loop" apa pun yang dibuat juga akan dipisahkan menjadi ruang baru. Solusinya tidak perlu benar-benar akurat (margin kesalahan 10% dapat diterima) dan juga tidak sering dihitung (<1 / d).
Room
memuat daftarPoint
s, dan kemudian mendapatkan segmen dengan menghubungkan setiap titik dan kemudian memutarnya kembali. Jika tidak, dengan pengaturan Anda saat ini, sangat timur untuk mendapatkan nilai yang salah (mis. Ruangan tertutup, ruangan dengan dinding di tengah, dll.). Ini akan menjadi pilihan terbaik.Room
s untuk selalu lengkap, dan itu mungkin tidak terjadi jika saya meminta pemain membuatRoom
s menggunakanSegment
s. Juga, fungsi ruang tertutup mudah untuk didefinisikan (hanya loop melaluiSegment
s dan pastikan mereka membuat ruang).Jawaban:
Anda dapat menggunakan rumus tali sepatu Gauss :
Anda perlu mengambil koordinat x dari setiap titik, kalikan dengan koordinat y titik berikutnya, lalu kurangi koordinat y titik saat ini dikalikan dengan koordinat x titik berikutnya dari hasil dan menambahkannya ke total area. Setelah Anda melakukan ini untuk setiap titik, membagi dua area total untuk mendapatkan area sebenarnya dari poligon. Jika titik saat ini adalah yang terakhir, maka yang berikutnya adalah yang pertama.
sumber
A
dinegasikan. Tergantung pada tujuan,A = |A|
mungkin diperlukan. Dengan kode area negatif dapat menemukan area pada donat tidak teratur menggunakan daftar poin di dalam dan luar (satu dalam urutan yang berlawanan).Kita juga bisa menggunakan metode Monte Carlo.
Gambarlah persegi panjang di sekitar bentuk sewenang-wenang. Ambil contoh sumber PRNG yang terdistribusi secara merata. mersenne twister, lalu ikat output dengan X, Y panjang persegi panjang menggunakan fungsi modulo. Hitung tidak. poin acak yang mendarat di dalam bentuk Anda. Membagi dengan jumlah total poin yang dihasilkan. Kalikan hasil bagi itu dengan area persegi panjang itu. Dengan setiap iterasi, Anda akan bertemu ke area yang benar. Algoritma ini sangat paralel dan dapat digunakan untuk menghitung 'volume' bentuk sewenang-wenang, selama Anda dapat menentukan apakah koordinat R ^ N berada dalam batas R ^ N bentuk..
sumber
Pendekatan lain: Jangan.
Sebagai gantinya:
Pada dasarnya, potong segitiga. Luas segitiga adalah sederhana dan dengan demikian kami mengurangi jumlah segmen sisanya dengan satu. Ulangi sampai yang tersisa adalah segitiga.
sumber