繁体   English   中英

"找到点到复杂曲线的最小距离"

[英]Find minimum distance from point to complicated curve

我有一条复杂的曲线,定义为表格中的一组点,如下所示(完整的表格在这里<\/a>):

#  x   y
1.0577  12.0914
1.0501  11.9946
1.0465  11.9338
...

如果您愿意使用库,请看看它的shapelyhttps//github.com/Toblerity/Shapely

作为一个简单示例( points.txt包含您在问题中链接的数据):

import shapely.geometry as geom
import numpy as np

coords = np.loadtxt('points.txt')

line = geom.LineString(coords)
point = geom.Point(0.8, 10.5)

# Note that "line.distance(point)" would be identical
print point.distance(line)

作为一个交互式示例(这也绘制了您想要的线段):

import numpy as np
import shapely.geometry as geom
import matplotlib.pyplot as plt

class NearestPoint(object):
    def __init__(self, line, ax):
        self.line = line
        self.ax = ax
        ax.figure.canvas.mpl_connect('button_press_event', self)

    def __call__(self, event):
        x, y = event.xdata, event.ydata
        point = geom.Point(x, y)
        distance = self.line.distance(point)
        self.draw_segment(point)
        print 'Distance to line:', distance

    def draw_segment(self, point):
        point_on_line = line.interpolate(line.project(point))
        self.ax.plot([point.x, point_on_line.x], [point.y, point_on_line.y], 
                     color='red', marker='o', scalex=False, scaley=False)
        fig.canvas.draw()

if __name__ == '__main__':
    coords = np.loadtxt('points.txt')

    line = geom.LineString(coords)

    fig, ax = plt.subplots()
    ax.plot(*coords.T)
    ax.axis('equal')
    NearestPoint(line, ax)
    plt.show()

在此输入图像描述

请注意,我添加了ax.axis('equal') 在数据所在的坐标系中进行shapely操作。如果没有等轴图,视图将会失真,虽然shapely仍然会找到最近的点,但在显示中看起来不是很正确:

在此输入图像描述

该曲线本质上是参数化的,即对于每个x,不需要唯一的y,反之亦然。 所以你不应该插入y(x)或x(y)形式的函数。 相反,你应该做两个插值,x(t)和y(t),其中t是相应点的索引。

然后使用scipy.optimize.fminbound找到最优t,使得(x(t) - x0)^ 2 +(y(t) - y0)^ 2是最小的,其中(x0,y0)是红点在你的第一个数字。 对于fminsearch,您可以指定t的最小/最大界限为1len(x_data)

您可以尝试在曲线上的增量点对上实现点到线距离的计算,并找到最小值。 这将从绘制的曲线中引入一点误差,但它应该非常小,因为这些点相对靠近在一起。

http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

您可以在 PyPI 中轻松使用包 trjtrypy: https<\/a> :\/\/pypi.org\/project\/trjtrypy\/

此软件包中提供了所有需要的计算和可视化。 您可以在一行代码中得到答案,例如:

获得最小距离使用: trjtrypy.basedists.distance(points, curve)

可视化曲线和点使用: trjtrypy.visualizations.draw_landmarks_trajectory(points, curve)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM