Python 沿距多边形指定距离的直线查找点

Python 沿距多边形指定距离的直线查找点,python,numpy,geometry,Python,Numpy,Geometry,给定一个由一系列点和一条无限直线定义的二维闭合多边形,我想在该直线上找到距离多边形指定距离的点。已知多边形是闭合的,不相交,且不包含3个连续共线点。一般来说,沿线有许多可能的点。理想情况下,我希望找到所有的,或者最接近某个初始猜测位置的。我正在使用python,但任何语言的解决方案都会很有帮助。我相信scipy.spatial将是一个重要的组件,但我不知道如何完成整个解决方案。下面是一些定义问题的代码,其中至少显示了一些涉及的特殊情况: import numpy as np import mat

给定一个由一系列点和一条无限直线定义的二维闭合多边形,我想在该直线上找到距离多边形指定距离的点。已知多边形是闭合的,不相交,且不包含3个连续共线点。一般来说,沿线有许多可能的点。理想情况下,我希望找到所有的,或者最接近某个初始猜测位置的。我正在使用python,但任何语言的解决方案都会很有帮助。我相信scipy.spatial将是一个重要的组件,但我不知道如何完成整个解决方案。下面是一些定义问题的代码,其中至少显示了一些涉及的特殊情况:

import numpy as np
import matplotlib.pyplot as plt

poly = np.array([[0, 0],
                 [10, 0],
                 [10, 3],
                 [1, 1],
                 [1, 6],
                 [0, 6],
                 [.8, 4],
                 [0, 0]])

line = np.array([[-2, 4.5],
                 [12, 3]])

plt.plot(poly[:, 0], poly[:, 1])
plt.plot(line[:, 0], line[:, 1])
plt.xlim([-1, 11])
plt.ylim([-1, 7])
plt.show()

points = find_points_distance_from_polygon(poly, line, distance)
编辑:我正在寻找找到点的算法

更新: 到目前为止,我尝试的是使用到每个点的距离的近似解。我的想法是,如果我通过沿每条线添加额外的点来细化多边形,那么这种方法可能足够精确。然而,如果距离很小,我就必须增加很多分数。我想可能有更好的办法

import scipy.spatial as spatial
import scipy.optimize as opt
import math

def find_point_distance_from_polygon_along_line(tree, line, dist, guess_ratio):
    def f(x):
        pt = line[0, :] + x * (line[1, :] - line[0, :])
        d, i = tree.query(pt)
        return math.fabs(d - dist)

    res = opt.minimize(f, [guess_ratio])
    return line[0, :] + res.x * (line[1, :] - line[0, :])

tree = spatial.cKDTree(poly)
pt = find_point_distance_from_polygon_along_line(tree, line, 1, 0)

对于图中的示例,距离为0.5,我希望在大约.1、4.2、1.5、4.1、9.1、3.3和10.5、3.1处找到4个点。我目前的计划是找到更多的点,特别是距离多边形对边有一定距离的点。我希望将线上的点连接到多边形的线位于多边形外部。

如果多边形边的数量合理,可以使用简单的线性算法

让我们来看看直线的参数方程是什么

L(u) = L0 + u * dL
其中L0是某个基点,dL是方向向量,u是参数

t = DotProduct(L(u) - P[i], Dir[i])    //equation 1
第i段的参数方程为

P = P[i] + t * Dir[i]
其中p[i]是段的第一点,Dir[i]是归一化方向向量,t是范围0..1内的参数

直线上的任意点在参数处的给定线段上有其投影

t = DotProduct(L(u) - P[i], Dir[i])    //equation 1
而法线到投影所需距离的长度为

Dist = Abs(CrossProduct(L(u) - P[i], Dir[i]))
Abs((L0x + u * dLx - Px) * Diry - (L0y + u * dLy - Py) * Dirx) = Dist 
so
u  = (+-Dist - ((L0x- Px)*Diry -(L0y-Py)*Dirx)) / (dLx * Diry - dLy * Dirx)
将值u代入方程式1,并检查参数t是否在段内的投影范围0..1内。如果是,则需要Lu点

然后检查到顶点的距离-求解

(L0x + u * dLx - Px)^2 + (L0y + u * dLy - Py)^2 = Dist^2

您的代码基本上只进行绘图。你是在要求一个算法来找到各自的点吗?看看。你会找到你要找的任何东西。@Mistermiagi是的,我在找算法。我编辑了这个问题,希望能让它更清晰。那么,到目前为止,你到底尝试了什么?这不完全是火箭科学,为什么不使用一种通用的交叉方法呢?@MisterMiyagi补充了我目前所做的工作