ฉันอยากโยนรังสีเงาแทนที่จะเป็นแนวสายตา
สมมติว่านี่เป็นพื้นที่ดูของคุณ (พื้นที่ที่มองเห็นได้)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
ไม่สามารถมองเห็น # blocks ในขณะที่ มองเห็นได้
ลองใส่อุปสรรค X:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
คุณมีรายการ X ที่อยู่ในพื้นที่มุมมองจากนั้นคุณทำเครื่องหมายว่าซ่อนทุกไทล์ที่อยู่ด้านหลังสิ่งกีดขวางนี้: เมื่อสิ่งกีดขวางถูกทำเครื่องหมายว่าซ่อนอยู่คุณจะลบมันออกจากรายการ
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
ในตัวอย่างด้านบนคุณสามารถเห็นเงาที่ถูกหล่อทางด้านขวาสุดของผนังด้านล่างและวิธีที่เงานี้ลบสิ่งกีดขวางที่ซ่อนอยู่ออกจากรายการของสิ่งกีดขวางที่คุณต้องตรวจสอบ (X ต้องตรวจสอบ; * ถูกตรวจสอบ)
หากคุณได้รับการจัดเรียงรายการโดยใช้พาร์ติชันไบนารีบางส่วนดังนั้น Cosest X จะถูกตรวจสอบก่อนคุณอาจเร่งความเร็วการตรวจสอบของคุณเล็กน้อย
คุณอาจใช้อัลกอริทึม "การรบทางเรือ" เพื่อตรวจสอบบล็อกของ X ในคราวเดียว (โดยทั่วไปมองหา adiacent X ที่อยู่ในทิศทางที่ทำให้กรวยเงากว้างขึ้น)
[แก้ไข]
จำเป็นต้องมีสองรังสีในการหล่อเงาอย่างถูกต้องและเนื่องจากแผ่นกระเบื้องเป็นรูปสี่เหลี่ยมผืนผ้าจึงสามารถทำการสันนิษฐานได้หลายวิธีโดยใช้สมมาตรที่มีอยู่
พิกัดของรังสีสามารถคำนวณได้โดยใช้การแบ่งช่องว่างอย่างง่าย ๆ รอบแผ่นสิ่งกีดขวาง:
แต่ละพื้นที่สี่เหลี่ยมประกอบด้วยตัวเลือกเกี่ยวกับมุมของกระเบื้องที่ควรเป็นขอบรูปกรวยเงา
เหตุผลนี้สามารถผลักดันต่อไปเพื่อเชื่อมต่อแผ่นกระเบื้องหลายแผ่นที่อยู่ติดกัน
ขั้นตอนแรกคือการทำให้แน่ใจว่าไม่มีสิ่งกีดขวางไปในทิศทางของผู้สังเกตการณ์ในกรณีนั้นให้พิจารณาสิ่งกีดขวางที่ใกล้ที่สุดแทน:
ถ้าแผ่นสีเหลืองเป็นสิ่งกีดขวางที่แผ่นนั้นกลายเป็นแผ่นสีแดงใหม่
ตอนนี้ให้พิจารณาขอบกรวยด้านบน:
แผ่นสีฟ้าเป็นตัวเลือกที่เป็นไปได้เพื่อให้กรวยเงากว้างขึ้น: หากอย่างน้อยหนึ่งในนั้นเป็นสิ่งกีดขวางรังสีสามารถเคลื่อนย้ายได้โดยใช้การแบ่งพื้นที่รอบแผ่นกระเบื้องดังที่เห็นมาก่อน
ไทล์สีเขียวเป็นตัวเลือกเฉพาะเมื่อผู้สังเกตการณ์อยู่เหนือเส้นสีส้มที่ตามมา:
สิ่งเดียวกันหมายถึงรังสีอื่นและตำแหน่งอื่นของผู้สังเกตการณ์เกี่ยวกับสิ่งกีดขวางสีแดง
แนวคิดพื้นฐานคือการครอบคลุมพื้นที่มากที่สุดเท่าที่จะเป็นไปได้สำหรับการหล่อกรวยแต่ละครั้งและเพื่อลดรายการอุปสรรคที่จะตรวจสอบให้เร็วที่สุด