시선 대신 그림자 광선을 드리 우고 싶습니다.
이것이 뷰 영역 (가시적으로 보이는 영역)이라고 가정하겠습니다.
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
# 블록은 동안 보이지 않습니다. 보인다
장애물 X를 넣자 :
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
보기 영역 내에있는 X 목록이 있고이 장애물 각각 뒤에있는 모든 타일을 숨겨둔 것으로 표시합니다. 장애물이 숨겨져있는 것으로 표시되면 목록에서 제거합니다.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
위의 예에서 맨 아래 벽의 가장 오른쪽에 드리운 그림자와이 그림자가 확인해야하는 장애물 목록에서 숨겨진 장애물을 삭제하는 방법을 볼 수 있습니다 (X 확인해야 함; * 확인 됨).
이진 partiton을 사용하여 목록을 정렬하면 가장 성가신 X를 먼저 확인하면 검사 속도가 약간 빨라질 수 있습니다.
일종의 "해군 전투"알고리즘을 사용하여 한 번에 X 블록을 검사 할 수 있습니다 (기본적으로 그림자 원뿔을 더 넓게 만들 수있는 방향에있는 외부 X 찾기)
[편집하다]
그림자를 올바르게 투사하려면 두 개의 광선이 필요하며 타일이 직사각형이므로 사용 가능한 대칭을 사용하여 많은 가정을 수행 할 수 있습니다.
장애물 타일 주위의 간단한 공간 분할을 사용하여 광선 좌표를 계산할 수 있습니다.
각 직사각형 영역은 타일 모서리에서 그림자 원뿔 가장자리로 간주해야 할 항목을 선택합니다.
이 추론은 여러 개의 인접한 타일을 연결하고 다음과 같이 하나의 더 넓은 원뿔을 캐스팅하도록 추가로 푸시 될 수 있습니다.
첫 번째 단계는 관찰자 방향을 향한 장애물이 없도록하는 것입니다.이 경우 가장 가까운 장애물이 대신 고려됩니다.
노란색 타일이 장애물이면 해당 타일이 새 빨간색 타일이됩니다.
이제 상단 원뿔 가장자리를 고려하십시오.
파란색 타일은 그림자 원뿔을 더 넓게 만들 수있는 모든 후보입니다. 하나 이상이 장애물 인 경우 이전에 본 타일 주위의 공간을 사용하여 광선을 이동할 수 있습니다.
녹색 타일은 관찰자가 다음 주황색 선 위에있는 경우에만 후보입니다.
다른 장애물과 적색 장애물에 대한 관찰자의 다른 위치도 마찬가지입니다.
기본 아이디어는 각 콘 캐스팅에 가능한 한 많은 영역을 다루고 확인해야 할 장애물 목록을 가능한 빨리 단축하는 것입니다.