Tôi có một đối tượng phòng được xác định bởi một tập hợp các phân đoạn dòng lặp mà tôi cần tính diện tích cho. Các lớp có thể được mô tả như sau (bằng mã giả):
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();
}
Các bức tường của một căn phòng không bao giờ có thể giao nhau ở bất cứ đâu, nhưng tại các điểm cuối của các phân khúc và bất kỳ "vòng lặp phụ" nào được tạo ra cũng sẽ được tách thành một phòng mới. Giải pháp không cần phải hoàn toàn chính xác (tỷ lệ sai số 10% là chấp nhận được) và cũng không được tính toán thường xuyên (<1 / s).
Room
phải luôn luôn hoàn thành và đó có thể không phải là trường hợp nếu tôi có người chơi xây dựng Room
s bằng cách sử dụng Segment
s. Ngoài ra, một chức năng phòng kín rất dễ xác định (chỉ cần lặp qua các Segment
s và đảm bảo rằng chúng tạo ra một phòng).
Room
khi chứa một danh sách cácPoint
s, và sau đó lấy các phân đoạn bằng cách kết nối từng điểm với nhau và sau đó lặp lại xung quanh. Mặt khác, với thiết lập hiện tại của bạn, sẽ rất đông để nhận các giá trị không chính xác (ví dụ: phòng không được tiết lộ, phòng có tường ở giữa, v.v.). Đây sẽ là lựa chọn tốt nhất.