지금은 가시 거리에 Bresenham의 라인 알고리즘을 사용하고 있습니다. 문제는 플레이어가 벽을 볼 수있는 가장자리 케이스를 찾았다는 것입니다. 플레이어가 특정 각도에서 다른쪽에 틈이있는 벽의 두 모서리를 볼 때 발생합니다.
내가 원하는 결과는 두 벽 사이의 타일이 유효하지 않은 것으로 표시되는 것입니다.
이 문제를 해결하기 위해 Bresenham의 라인 알고리즘을 수정하는 가장 빠른 방법은 무엇입니까? 좋은 해결책이 없다면 더 적합한 알고리즘이 있습니까? 어떤 아이디어라도 환영합니다. 이 솔루션은 3d를 지원할 수 있어야합니다.
편집 : 내 간단한 해결책은 선의 x 및 y 좌표가 변경 될 때 두 모서리가 닫혀 있는지 확인하는 것입니다. 작업 소스 코드와 완성 된 제품의 대화식 데모는 http://ashblue.github.io/javascript-pathfinding/을 참조하십시오.
답변
에릭 리퍼 트 (Eric Lippert)는 C #에서 쉐도우 캐스팅 으로 직사각형 평면 그리드 에서 가시 거리를 생성하는 데 뛰어난 시리즈를 썼습니다 .
다른 문제 중에서도 Eric은 다양한 결과를 제공하고 시선 요구 사항에 대해 답변해야하는 다양한 질문을 처리했으며 서로 다른 결과를 보여줍니다. 이 기사 중 하나는 초기 버전의 알고리즘에서 발생하는 “모퉁이를 돌보는”상황을 심층적으로 다룹니다.
Eric의 알고리즘을 6 각형 그리드 에 적용 했으며 가시성이 넓은 반경 (> 60 헥스)의 큰 6 각형 그리드 (> 400 x 700)에서 성공적으로 사용했습니다. 이 구현은 단일 i7 CPU를 사용하여 깜박일 수있는 한 빨리 완벽한 FOV를 계산하고 표시합니다. 이것은 내가 기대하는 용도에 충분히 빠릅니다.
업데이트 -고도와 시선 : 위
의 16 진 그리드 구현은 장애물이 아니라 고도와 시선을 계산합니다. 문서 참고 사항은 표고 계산과 관련하여 추가 결정을 내려야합니다 : 목표 높이와 관찰자 높이. 기본 선택은 둘 다 동일하게 만들어 대칭 시야를 생성하지만지면에서지면으로 및 관찰자의 눈으로도 선택할 수 있습니다. (코드는 MIT 라이센스 하의 오픈 소스입니다)
답변
LOS 계산의 경우 코너 갭을 채우는 별도의 “고해상도”그리드가있는 경우 어떻게해야합니까? 나는 이런 식으로 생각하고 있었다 :
왼쪽은 4 사각형의 원래 블록 섹션입니다.
오른쪽은 “고해상도”버전입니다. 각 원래 정사각형이 쿼터로 세분화되어 있고 모서리 중 하나가 채워져 있음을 알 수 있습니다. 알고리즘을 생성하여이를 생성하는 것은 확실하지 않지만 사전 계산할 수는 있습니다. 현재지도에서
그것은 좌표 공간이 네 배로 늘어났다는 것을 의미하지만 중요한 성능 문제는 아닙니다.