태그 보관물: problem-solving

problem-solving

최대로 대상에 대한 총알 경로를 계산하기위한 알고리즘 리코 2 개 중 어느 하나에 대해 동일 선상에

불쌍한 제목으로 인해 죄송하지만 문구를 더 잘 표현할 수있는 방법이 없었습니다 …

그래서 거기에 닌텐도에 WiiPlay라고합니다 (예!) 닌텐도에 의해이 놀라운 게임 . 여기에는 9 개의 미니 게임이 있으며 내가 가장 좋아하는 게임은 탱크입니다! . 자신을 파괴하지 않고 COM 적 탱크를 파괴하는 것입니다. 레벨의 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

탱크를 파괴하는 한 가지 방법은 총알을 발사하는 것입니다. 이 라임 그린 적 탱크가 있으며 벽과 블록에 두 번 튀어 나오는 고속 총알을 발사합니다. 중앙의 석회 탱크가 이미지에 그려진 녹색 경로를 따라 총알을 발사 할 수 있으므로 플레이어 탱크가 현재 위치에 있으면 플레이어 탱크가 즉시 파괴되는 방법을 알 수 있습니다.

아마추어 프로그래머로서 저는 라임 탱크가 플레이어 탱크를 때리는 방향을 어떻게 결정할 수 있는지 궁금합니다.

나는 그것에 대해 스스로 생각했지만 가능한 알고리즘을 찾지 못했습니다. 그들이 누군가에게 영감을 주었을 때의 결론을 설명하겠습니다. 설명하는 동안 간단하게하기 위해 은 총알이 튀어 나올있는 표면 이라고 가정합니다 . 따라서 블록의 분리 된 사각형은 4 개의 벽을 형성합니다.

총알 리 코팅이 항상 평행 사변형의 한면에 놓여 있거나 평행 사변형의 반대 정점이된다는 결론을 내 렸습니다. 발사하는 적 탱크와 그것이 목표로하는 플레이어 탱크는 반드시 다른 2 개의 정점 일 필요는 없지만, 평행 사변형의 4면 중 어느 하나에 대해 동일 선상에 놓여 있습니다. 다음은 평행 사변형을 형성 할 수있는 4 가지 방법을 보여줍니다.

HOR-VER 은 총알이 먼저 수평 벽에 닿은 다음 수직 벽에 닿는 것을 의미합니다.

그리고 나는 붙어있다. 적 탱크와 플레이어 탱크를 연결하는 선을 움직여 벽에 두 번의 히트로 평행 사변형을 형성하는지 확인했지만 적 탱크와 플레이어 탱크가 그렇지 않기 때문에 항상 작동하지는 않습니다. 평행 사변형의 꼭짓점과 일치해야합니다.

또한 알고리즘의 일반적인 흐름을 잘 모르겠습니다. 알고리즘은 다음 두 가지 구조 중 하나를 사용합니까, 아니면 두 가지 모두 잘못되었을 수 있습니까?

  • 가능한 경로를 파악하고 항상 최선의 경로로 표시하고 (여러 기준에 따라 가장 짧거나 가장 모호하며, 피할 수없는, 또는 종합적이고 가중 된 평가 일 수 있음) 나머지는 잊어 버리십시오. 모든 계산 후 남은 것이 가장 좋습니다.
  • 먼저 총알로 도달 할 수있는 모든 벽을 확인한 다음 (각 벽에 도달하기 위해 총알이 다른 벽에 튀어 나올 필요는 없음) 각 벽에 도달 할 수있는 모든 범위를 결정합니다 (때로는 원거리에 도달 할 수 없음) 다른 벽이 근처에 있으면 리코 치가없는 벽), 다시 리코 치가있는 모든 도달 가능한 벽과이 벽에서 도달 할 수있는 모든 범위를 결정합니다. 이 4 가지 프로세스는 광선 추적과 유사한 방식으로 수행 할 수 있습니다. 각 과정에서 플레이어 탱크에 광선이 닿으면 광선에 따라 총알 경로를 알아냅니다.

제 생각에는이 알고리즘은 다음과 같은 이유로 알아 내기가 어렵습니다.

  • 총알은 어떤 방향으로도 발사 될 수 있습니다. 과
  • 수학에서와 같이 벽에 무한히 많은 점이 있으며, 선에는 무한히 많은 점이 있습니다.

그러나 닌텐도 사람들은 어쨌든 그것을 만들었습니다.



답변

직접적인 시선이 주어지면 문제는 분명 사소합니다. 그러나 우리는 반성을 다루고 있습니다. 광선 추적 프로그램의 일부로 반사를 구현할 때 장면의 어느 부분을 볼 수 있는지 올바르게 찾아내는 것은 어려운 일입니다. 두 가지 유망한 각도 사이의 “이진 검색”도 실행 가능하지 않습니다. 반사로 인해 실제로 보이는 공간이 연속적이지 않으므로 휴리스틱 “A의 오른쪽과 B의 왼쪽에 있으면 대상이 있어야합니다. A와 B 사이의 솔루션은 허용되지 않으며 “크리에이티브”솔루션을 놓치게됩니다. 대신 가상 위치에서 추적기를 다시 실행하여 반사를 구현하는 것이 좋습니다 . 미러에서 볼 때 발사 탱크가 보이는 위치입니다 .

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

미러 된 광선은 이제 가상 위치에서 시작되는 직선이라는 이점이 있습니다. 다음 스케치에서 기술을 설명하려고했습니다.

X는 발사 위치, (X) 목표를 표시합니다. 컬러 영역이 보입니다.

  1. 직접 시선 : 대상이 보이지 않습니다. 그러나 표면 (1)과 (2)를 칠 수 있습니다.

  2. 한 번의 반사. 장애물 안에는 두 개의 가상 발사 위치가 있습니다. 아래쪽 위치는 LOS를 직접 향하게하므로 첫 번째 발사 솔루션이 있습니다. 총알 경로는 대상과 하부 미러 표면 사이, 광선-미러 충돌 지점과 실제 발사 위치 사이의 광선의 일부입니다.

  3. 두 번의 반사 : 첫 번째 반사에서 위쪽 가상 위치는 거울 표면을 통해 아래쪽 장애물의 일부를 볼 수 있습니다. 두 번의 반사가 허용되므로이 위치를 더 낮은 장애물로 미러링 할 수 있습니다. 위치는 (I) 실제 위치, (II) 첫 번째 반사의 가상 위치 및 (III) 두 번째 반사의 가상 위치로 표시됩니다.

    (III)부터 LOS를 목표 (X)로 향하게해서 또 다른 발사 솔루션을 찾았습니다. 불릿 경로는 X-III 선을 따라 두 번째 미러 충돌 지점까지, 그 다음 미러 충돌 지점 사이의 III-II 라인을 따라, 마지막으로 II-I 라인을 따라 첫 번째 미러 충돌 지점에서 실제 위치 I까지입니다.

    실제로, 첫 번째 반사에서 낮은 가상 위치도 상부 장애물에 반영 될 수 있지만 이는 직접적인 해결책으로 이어지지는 않습니다.

장애물의 어느 부분이 보이는지 알아 내고 (따라서 총알을 반영하는 데 사용할 수 있음) 깊이 우선 검색을 통해 미러링을 구현하는 것이 간단 해 보입니다. 적합한 거울 표면을 찾기 위해 Nicky Case의 Sight & Light에 요약 된 기술을 사용할 수 있습니다. 개구부를 놓칠 수 있고 낭비 인 360 개의 벡터를 시험하는 대신 장애물 가장자리까지만 광선을 발사합니다.


답변

Karl Bielefeldt 아이디어를 2 개의 벽 반사로 확장하기 만하면됩니다.

A와 B가 제공됩니다 (탱크). 먼저 A가 볼 수있는 모든 벽과 B가 볼 수있는 모든 벽을 나열해야합니다. 그런 다음 첫 번째 벽이 주먹리스트에 있고 두 번째 벽이 첫 번째 벽과 다르고 두 번째 목록에있는 쌍을 만듭니다. 가능한 모든 벽 쌍에 대해이 테스트를 수행해야합니다 (후보자를 제거 할 방법을 찾지 않는 한). 주어진 벽 쌍에 대해 R과 S를 찾으면 확인하십시오.

1) A에 R의 직접적인 비전이있는 경우

2) R이 벽 1에 속하는 경우 (벽은 단지 선분이며 전체 선은 아님)

3) R이 S에 직접 액세스 할 수있는 경우

4) S가 wall2에 속하는 경우 (벽은 단지 선분이며 전체 선이 아님)

5) S가 B에 직접 액세스 할 수있는 경우

R과 S를 찾으려면 wall1을 알고 있기 때문에 wall1에 접하는 선 방정식을 결정할 수 있습니다. R은 wall 1에 접하는 선에 속하므로 R의 두 좌표 사이에 관계가 있습니다 (1의 자유 도로 끝남). R) S와 유사합니다 (이 점은 벽 2의 선 탠 제트에 속하므로 S 좌표간에 관계가 있습니다). 이제 자유도가 2이고 해를 구하려면 2 개의 추가 독립 방정식이 있어야합니다. 한 가지 방정식은 다음과 같습니다.

(AA')/(RA')=(SS')/(RS')

다른 방정식은 다음과 같습니다.

(BB')/(SB')=(RR')/(SR')

위의 방정식 A, A ‘, B, B’는 알고 있거나 직접 계산할 수 있습니다. R ‘및 S’는 R 및 S의 좌표 및 벽 방정식의 함수입니다. 나는 수학을 끝내지 않았으므로 방정식이 어떻게 보일지 모르겠습니다.


답변

리 코팅을 떠나는 각도가 들어가는 각도와 같아야한다는 사실을 이용할 수 있습니다. y 좌표가있는 주어진 수평 벽과 좌표 c가있는 두 개의 고정 탱크 (a,b)(d,e)의 경우 아래 식을 만족하는 각도는 하나뿐입니다.

그냥 해결 x당신이 목표로해야하는 벽을 따라 거리를 얻을 수 있습니다. 두 벽이 동일하게 작동합니다. 두 개의 방정식과 두 개의 미지수 만 있습니다.


답변

광선을 지시하는 방법을 보여주는 깔끔한 다이어그램이 있으므로 한 쌍의 반사 표면을 결정하는 방법에 대해 자세히 설명하겠습니다.

하자 먼저 표면 명중해야 표면 전화 , 두 번째, B를 .

A 에서 촬영하여 B 의 (가시적) 가장자리를 치십시오 . 다시 말해, 거울 완성 A를 보면 B 끝이 반사되는 지점을 결정하십시오 . 이 작업은 쉬워야하며 처리 할 반사 지점이 하나뿐입니다.

이제 B 의 (가시적) 가장자리에 닿는 두 개의 광선을 알았습니다 . 하자 그들을 호출 가장자리 광선이 떨어져 자신의 반사를 계산 B; 그들은 당신의 목표를 넘어서 어딘가에 가야합니다. 대상이 대상 사이에 있는지 , 즉 한 광선의 왼쪽에 있지만 다른 광선의 오른쪽에 있는지 또는 그 반대 인지를 결정할 수 있습니다 . 이것은 직선일반 방정식을 사용하는 것이 쉽지 않습니다 .

대상이 가장자리 광선 사이에 있지 않으면 분명히 중간 광선으로 칠 수 없습니다. 다른 표면 쌍을 선택하십시오.

대상 광선 사이에 있으면 이진 검색을 사용하여 중간 타격 광선을 찾으십시오. 모서리 광선에 해당하는 두 개의 발사 각도가 있으며 타격 각도는 그 사이에 있습니다. 발사 지점에서 볼 때 목표의 각도 직경이 지나치게 작지 않은 경우, 타격 광선의 방향을 찾을 때까지 반복이 거의 필요하지 않습니다.

사진은 다음과 같습니다.

여기에 두 개의 가장자리 광선이 빨간색과 파란색으로 표시됩니다. 분명히 당신은 광선이 녹색 목표물에 부딪 칠 수 있도록 적색 광선보다 작은 각도에서 방출되지만 적색 광선보다 큰 광선을 찾을 수 있습니다.


답변

우선, 빛의 굴절에 대해 이야기 할 때 물리 수업에서 기억하십니까? 이러한 원칙을 사용하여 문제를 해결할 수 있습니다. 입사각은 반사각과 동일하다. 적 탱크는 첫 번째 바운스에서 가능한 모든 각도를 통과해야 두 번째 바운스가 플레이어를 때릴 수 있습니다. 광선 추적 아이디어도 계속 사용하십시오. 이제 플레이어가 움직일 때 복잡해 지지만 알고리즘을 시작하는 데 충분한 아이디어가되어야합니다.


답변