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