나는 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와를 사용하고
. 휠을 다시 발명 할 필요는 없습니다.
여기 내가 당신을 도울 수 있다고 생각하지 않습니다. 나는 당신이 양쪽에 포인트를 반환하고 싶다는 것을 결코 알지 못했다. 나는 당신이 가장 가까운 버텍스를 원한다고 생각했다. 수학은 너무 힘들어서 이해할 수없는 것 같습니다 : ( –