python - nD线与Python中凸包的交点

标签 python computational-geometry intersection convex-hull

我使用 scipy.spatial.ConvexHull 创建了一个凸包。我需要计算凸包和射线之间的交点,从 0 开始并沿其他定义点的方向。已知凸包包含 0,因此应保证相交。问题的维度可能在 2 到 5 之间变化。我尝试了一些谷歌搜索但没有找到答案。我希望这是计算几何中已知解决方案的常见问题。谢谢。

最佳答案

根据 qhull.org ,凸包的一个面的点x验证V.x+b=0,其中Vbhull.equations 给出。 (. 代表这里的点积。V 是一个长度为 1 的法向量。)

If V is a normal, b is an offset, and x is a point inside the convex hull, then Vx+b <0.

如果 U 是从 O 开始的射线向量,则射线方程为 x=αU, α>0。所以射线与小平面的交点是 x = αU = -b/(V.U) U。与船体的唯一交点对应于 α 正值的最小值: enter image description here

下一个代码给它:

import numpy as np
from scipy.spatial import ConvexHull

def hit(U,hull):
    eq=hull.equations.T
    V,b=eq[:-1],eq[-1]
    alpha=-b/np.dot(V,U)
    return np.min(alpha[alpha>0])*U

这是一个纯粹的 numpy 解决方案,所以速度很快。 [-1,1]^3 立方体中 100 万个点的示例:

In [13]: points=2*np.random.rand(1e6,3)-1;hull=ConvexHull(points)

In [14]: %timeit x=hit(np.ones(3),hull) 
#array([ 0.98388702,  0.98388702,  0.98388702])
10000 loops, best of 3: 30 µs per loop

关于python - nD线与Python中凸包的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486312/

相关文章:

c++ - 在CGAL中获取两个圆的交点

c - 给定中心,找到一组圆的最小半径,使它们完全覆盖另一个

algorithm - 找出同一直线上的相邻点

java - 检测图像何时与某种颜色相交?

math - 线与线段相交

python - 如何在Python中将阿拉伯文本转换为数字

python - wxpython GetStatusText()

python - 我的刮刀抛出错误而不是继续

python - numpy - 在点网格上评估函数

数据库搜索以返回按两个集合之间的交集大小排序的结果