我有一个带n
个点的多边形,我想找到这个多边形上最接近我的玩家p
的点。我该怎么做呢?
因此,为此,我迭代n个点的多边形中的每个点,如下所示:
for i in range(points.shape[0]-1):
for j in range(i+1, points.shape[0):
这会迭代多边形中的每对点,我将其用作要比较的线段。
然后我检查极端点,并试图查看该线段上的点是否更近。这是我的代码:
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,我没有标记为解决我的问题,因为我无法确认任何一个工作。我目前正在尝试调整&#34; r(t)=(2,0)+ tP3P2&#34;题。现在看来它不起作用。我相信它可能是我目前的代码。
当我运行代码并测试我的点(位于两点之间且线应该与多边形垂直)时,绘制到极致。
我的代码打印出距离d3小于d2和d1,因此它返回P3作为最近点。但是,它应该返回P2和P3之间的一个点。
红线显示了它想要达到的目的。
我正在使用numpy来更容易地使用线性代数的点和向量。没有必要在这里重新发明轮子。
答案 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)