如何找到线段上距任意点最近的点?

2024-06-26 09:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

此函数应接受一个点参数,该参数将用于查找直线段对象上与其最近的点。在示例断言代码中,getClosestPoint(Point())Point(10, 0)作为参数,并应返回Point(5,5)作为与l1 = Line(Point(5,5), Point(20,35))行上的最接近的点,端点是A Point(5,5), B Point(20,35),我不知道该如何解决这个问题。我当前的解决方案将返回(4,3),它不在线段上,而是在直线上。在

 from point import Point
 import math
 class Line:
    def __init__(self,aPoint=Point(), bPoint=Point()):
        self.firstPoint = aPoint
        self.secondPoint = bPoint

    def getClosestPoint(self,point=Point()):

        m1 = self.getSlope()
        m2 = -1 / float(m1)
        b1 = self.p1.y - m1 * self.p1.x
        b2 = point.y - m2 * point.x
        x = float(b2 - b1) / float(m1 - m2)
        y = m1 * x + b1
        return Point(x, y)

    if __name__ == "__main__":
         p1 = Point(5,5)
         p2 = Point(20,35)
         l1 = Line(p1,p2)
         assert l1.getClosestPoint(Point(10,0)) == Point(5,5)
         assert l2.getClosestPoint(Point(25/2,25/2)


 class Point: 
    def __init__(self,x=0,y=0):
       self.x = x
       self.y = y

Tags: importselfl1参数deflinefloat直线
2条回答

一般的答案是把点投影到直线上。 一种方法是将点转换成由你的段定义的参考框架(p1是新的原点(0, 0)p2新的(1, 0))。 然后,去掉新的y坐标(这是实际投影发生的地方),并将新点(x, 0)转换回原始帧。在

具体地说,你必须找到转换。 第二个,从新的空间到原来的空间很容易写(只要把它画在纸上,你就会看到):

^{1}$

但是你可以把这些方程倒过来,找到对应于点(x, y)的{}。在

当你这样做的时候,假设我们都没有犯任何错误或打字错误,你应该得到这样的信息:

^{pr2}$

编辑:如果你真的要在线段上找到最近的点而不是直线,那么很容易找到,因为如果投影在线段内,你就有0 <= nx <= 1(这是一个必要和充分的条件)。 在return语句之前,您可以强制nx停留在这个时间间隔内:

nx = min(1, max(0, nx))

再编辑: 上述声明相当于:

if nx<0:
    nx = 0
if nx>1:
    nx = 1

这样,直线上点的投影(可以在线段之外)在最近的点处被推回到线段(由0 <= nx <= 1定义)内。在

相关问题 更多 >