2017-11-01 2 views
2

나는 n 점의 다각형을 가지고 있는데이 폴리곤에서 가장 가까운 점을 내 플레이어 에두고 싶습니다. 어떻게해야합니까? 내가 비교 선분으로 사용할 다각형의 포인트 모든 쌍 이상파이 게임, 점 A에서 다각형의 가장 가까운 점 얻기

for i in range(points.shape[0]-1): 
    for j in range(i+1, points.shape[0): 

이 반복 :이 일에 내가 지금처럼 N 포인트의 다각형의 각 점을 반복 이처럼

반대.

그런 다음 극단적 인 포인트를 확인하고 해당 라인 세그먼트의 포인트가 더 가까이 있는지 확인하려고합니다.

def _get_closest_point(self, P1, P2, P3): 
     if numpy.linalg.norm(P3) > numpy.linalg.norm(P2): 
      tmp_p3 = P3 
      P3 = P2 
      P2 = tmp_p3 

     Ax = P3[0] - P1[0] 
     Ay = P3[1] - P1[1] 

     Bx = P2[0] - P3[0] 
     By = P2[1] - P3[1] 

     t = (Ax*Bx + Ay*By)/(2*(math.pow(Bx, 2) + math.pow(By, 2))) 

     f_prime_1 = 2*(math.pow(Bx, 2) + math.pow(By, 2)) 

     d3 = numpy.linalg.norm(P3 - P1) 
     d2 = numpy.linalg.norm(P2 - P1) 
     d1 = numpy.linalg.norm(P3 + t*(P2 - P3) - P1) 

     print "d1 " + str(d1) 
     print "d2 " + str(d2) 
     print "d3 " + str(d3) 

     if d2 < d3 and d2 < d1: 
      return P2 
     elif d3 < d2 and d3 < d1: 
      return P3 
     else: 
      return P3 + t*(P2 - P3) 

    def _get_closest_point_poly(self, points): 
     p = None 

     for x in range(points.shape[0]-1): 
      for y in range(x+1, points.shape[0]): 
       p1 = self.origin 
       p2 = points[x] 
       p3 = points[y] 

       tmp_p = self._get_closest_point(p1, p2, p3) 

       if not isinstance(p, list): 
        p = tmp_p 
       elif numpy.linalg.norm(tmp_p) < numpy.linalg.norm(p): 
        p = tmp_p 
     return p 

이 코드는 내가 중 하나의 작업을 확인 할 수없는 나처럼 아직 내 질문을 해결하기로하거나 표시하지 않은 한 가지 대답 here에서 적응했다 : 여기 내 코드입니다. 나는 현재 "r (t) = (2,0) + tP3P2"라는 질문을 적용하려고하고있다. 그것이 지금 서서 그대로 작동하지 않습니다. 나는 그것이 지금 나의 코드일지도 모른다라고 생각한다.

코드를 실행하고 내 지점을 테스트하면 (두 지점 사이에 있고 선은 다각형에 수직이어야합니다) 극단적으로 그립니다.

내 코드는 거리 d3이 d2와 d1보다 작기 때문에 가장 가까운 점으로 P3을 반환합니다. 그러나 P2와 P3 사이의 점을 반환해야합니다.

빨간 선은 도착하려고하는 지점을 나타냅니다. 내가 쉽게 선형 대수 점, 벡터와 함께 작동 할 수 있도록 NumPy와를 사용하고

enter image description here

. 휠을 다시 발명 할 필요는 없습니다.

+0

여기 내가 당신을 도울 수 있다고 생각하지 않습니다. 나는 당신이 양쪽에 포인트를 반환하고 싶다는 것을 결코 알지 못했다. 나는 당신이 가장 가까운 버텍스를 원한다고 생각했다. 수학은 너무 힘들어서 이해할 수없는 것 같습니다 : ( –

답변

3

매우 흥미로운 질문입니다!

vertices 목록이 있고 각 정점의 x 및 y 값을 저장하기 위해 두 개의 차원이 있다고 가정 해 보겠습니다.

목록을 반복하고 각 점에서 간단한 거리 공식을 수행하고 최저 거리를 기록하십시오.

이 답변으로 도움이 되었기를 바랍니다. 다른 질문이 있으시면 아래에 게시하십시오!

vertices = [[100, 100], [200, 200], [300, 300]] 

player = [100, 200] 

closestVertex = -1 
shortestDist = -1 

for vertex in vertices: 
    x, y = vertex 

    distance = (((x - player[0]) ** 2) + ((y - player[1]) ** 2)) 

    if(distance < shortestDist or shortestDist == -1): 
     shortestDist = distance 
     closestVertex = vertex 


print(closestVertex) 
+0

거리 계산에서'** 0.5'를 없애고 내 표를 받았습니다. –

+0

대신에'math.sqrt'를 사용할 것입니까? –

+0

제곱근을 구해야합니다. –