2012-05-22 6 views
1

2D지도가 있고 선이 요소와 충돌하는지 확인하고 싶습니다. 선이 어떤 오브젝트와 교차하는지 알 수있는 함수가 필요합니다.2D지도에서 선이 벽을 통과하는지 확인

enter image description here

레드 라인 (기능 false를 돌려) 정확하지 않은, 그리고 녹색 (true를 반환)됩니다

가보세요. 내 충돌 맵은 벽에 대해 1이고 빈 공간에 대해 0 인 부울 값의 맵입니다.

방법? 선이 어떤 벽과도 교차하는지 확인해야한다고 읽었지만 2d 맵에서이 작업을 수행하는 방법을 전혀 알지 못합니다.

답장에 대한 고맙습니다.

+0

이 선은 셀 중심점 만 끝점을 갖습니까? –

+1

센터 만. 어쩌면 미래에 나는 그것으로 sth을 할 것이지만 지금은 단지 센터 일 뿐이다. –

+0

-1에 대한 이유가 무엇입니까? ;/ –

답변

-1

그래서 저는 여러분의 세포가 사각형이라고 상상했습니다 ... 단위 사각형이라고합시다. 그래서, 어떤 좌표가 있다면, 어떤 점에 대해서, 어떤 수레 또는 복식인지, 그들은 셀 안에 있습니다.

  1. 당신이하는 세포가 바로 하나의 엔드 포인트에서 다른 및 각 셀에 대한 행
  2. 거리의 엔드 포인트가 알아야 테스트는 거짓 벽이나하지
  3. 반환의 경우 때 벽 그렇지 않으면 true입니다.

하나의 엔드 포인트에서 다른 도보하려면, 셀의 수, 즉, (우리는 여기에 세포를 얘기하고 있기 때문에, 그 값이 'INT'입니다 전화 delta_x 및 delta_y) 각 축의 델타를 계산하기 위해 필요 그것은 수직과 수평으로 나아 간다. 당신은이 중 가장 큰 것을 택합니다. 루프에 가장 큰 값을 사용합니다. 이 값은 D = max (delta_x, delta_y)이고 XX와 YY는 한 끝점의 셀 좌표입니다.

float step = 1.0f/D; 
float current_location = 0.0; 
for (int i = 0; i <= D; ++i, current_location += step) 
{ 
    int cur_x = XX + current_location * delta_x; 
    int cur_y = YY + current_location * delta_y; 
    if (intersect_wall(cur_x, cur_y)) 
    return false; 
} 
return true; 

그건 ...이 기능을 사용자의 기능에 맞게 조정하십시오.

+1

그건 나쁜 생각이야. 내 물건이 주목할 가치가 있다고 말하는 것은 아닙니다. 그러나이 알고리즘은 많은 엣지 경우에 많은 결함이 있습니다 (매우 수직선 또는 길고 약간 위쪽으로 올라갑니다). 일반은 내 것과 같습니다 : 라인의 픽셀을 찾은 다음 어느 픽셀이 충돌하는지 확인하십시오. 알고리즘 (bresenham,하지만 다른 것들이 있습니다)은 제가 제안한 것이 더 정확하고 곧 나타날 이슈는 없을 것입니다. – ClemKeirua

+0

나는 3 분 만에 내 머리 속에서 그것을했다. 사실, 나는이 방법을 사용하여 선을 그려서 간단하고 좋은 결과를 얻는다. 이보다 더 좋은 방법이 있기를 바랍니다! – widgg

+0

음, 나는이 중 하나가 가장 효과가 있다고 말할 수 있습니다. 그것의 아주 느린, 그래서 빨리 뭔가를 찾을 수 있지만 ... –

3

벽이 어떻게 표시되는지에 따라 다릅니다.

사각형 인 경우 해당 선과 사각형을 나타내는 4 개의 세그먼트 사이에 line/segment 교차가 있는지 확인하십시오.

픽셀 인 경우 bresenham line 알고리즘을 사용하여 줄의 픽셀이이 블록에 있는지 확인할 수 있습니다.

+0

두 번째 배열 충돌 맵의 비트입니다. 어쩌면 더 많은 것이 있을까요? Im newbie :( –

+1

그런 다음 Bresenham의 알고리즘을 찾으십시오. 트릭은 픽셀이 아닌 셀의 좌표 인 좌표를 사용해야한다는 것이고 목표는 선을 그리는 것이 아니라는 것입니다. 라인 (시작과 끝).bresenham의 알고리즘을 사용하여이 선의 모든 블록을 찾으십시오. 이 블록 중 하나가 벽 인 경우 충돌이 발생합니다. – ClemKeirua

1

당신 벽 폴 버크 설명대로 선 세그먼트의 교차점을 테스트 할 수있는 라인 세그먼트로 표현하는 경우 : 당신의 벽은 다각형으로 표현하는 경우 http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/

당신은 벽 다각형에 대한 테스트 라인을 클립 및 수 Paul Bourke가 설명하는 것처럼 클리핑 결과가 비어 있지 않은지 확인하십시오. http://local.wasp.uwa.edu.au/~pbourke/geometry/cliplinetopoly/