Tôi thà sử dụng các tia bóng thay vì các tia nhìn.
Giả sử đây là khu vực xem của bạn (khu vực có khả năng hiển thị)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
Các khối # không thể nhìn thấy trong khi. có thể nhìn thấy
Hãy đặt một số trở ngại X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
Bạn có một danh sách X nằm trong vùng xem, sau đó bạn đánh dấu là ẩn mọi ô phía sau mỗi chướng ngại vật này: khi một chướng ngại vật được đánh dấu là ẩn, bạn xóa nó khỏi danh sách.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
Trong ví dụ trên, bạn có thể thấy bóng đổ ở phía bên phải của bức tường phía dưới và cách bóng này xóa chướng ngại vật ẩn khỏi danh sách chướng ngại vật bạn phải kiểm tra (X phải kiểm tra; * đã kiểm tra).
Nếu bạn nhận được sắp xếp danh sách bằng cách sử dụng một số partiton nhị phân để cosest X được kiểm tra trước, bạn có thể tăng tốc kiểm tra một chút.
Bạn có thể sử dụng một loại thuật toán "Trận chiến hải quân" để kiểm tra khối X ngay lập tức (về cơ bản là tìm kiếm một X giả mạo theo hướng có thể làm cho hình nón rộng hơn)
[CHỈNH SỬA]
Cần có hai tia để chiếu chính xác một bóng và, vì một hình xếp là hình chữ nhật, rất nhiều giả định có thể được thực hiện bằng cách sử dụng các đối xứng có sẵn.
Các tọa độ tia có thể được tính bằng cách sử dụng phân vùng không gian đơn giản xung quanh ô vật cản:
Mỗi khu vực hình chữ nhật tạo thành một lựa chọn về những gì góc của gạch nên được lấy làm cạnh hình nón.
Lý do này có thể được đẩy xa hơn để kết nối nhiều gạch liền kề và để chúng đúc một hình nón rộng hơn như sau.
Bước đầu tiên là đảm bảo rằng không có chướng ngại vật nào hướng về phía người quan sát, trong trường hợp đó, chướng ngại vật gần nhất được xem xét thay thế:
Nếu ngói màu vàng là một trở ngại thì gạch trở thành ngói đỏ mới.
Bây giờ hãy xem xét các cạnh hình nón trên:
Các ô màu xanh là tất cả các ứng cử viên có thể để cho hình nón rộng hơn: nếu ít nhất một trong số chúng là chướng ngại vật, tia có thể được di chuyển bằng cách sử dụng không gian phân chia xung quanh ô đó như đã thấy trước đó.
Gạch màu xanh lá cây chỉ là một ứng cử viên nếu người quan sát ở trên đường màu cam theo sau:
Điều tương tự là viết tắt của các tia khác và cho các vị trí khác của người quan sát về chướng ngại vật màu đỏ.
Ý tưởng cơ bản là bao phủ càng nhiều diện tích càng tốt cho mỗi lần đúc hình nón và rút ngắn càng nhanh càng tốt danh sách các chướng ngại vật cần kiểm tra.