如何找到直线和曲线状二维点集的交点?

时间:2016-06-21 18:10:44

标签: python numpy set-intersection

假设我们有:

  1. 由描述近似高阶多项式曲线的二维数据集描述的曲线。
  2. 由两点定义的一条线。
  3. 这是一张示例图片:

    假设直线和曲线相互截距,我怎样才能找到直线和数据集之间的交点?

2 个答案:

答案 0 :(得分:0)

由于曲线数据看起来很密集且没有散射(例如数值求解的微分方程的结果),因此插补或近似整个曲线数据集是过度的。在下文中,我假设数据集的点沿着曲线排序(就好像它们是对参数曲线进行采样的结果)。

  1. 首先,进行coordiante变换A(x,y),并进行平移和旋转,使红线与x轴匹配。

  2. 将变换曲线与x轴相交,即从曲线数据集中获取y坐标的绝对值较小的所有点(并记住它们在数据集中的索引)。尝试使用y < 0.05描绘曲线。

  3. 使用2.中选择的点的索引来检测相邻曲线点的范围,每个范围类似于曲线的一小部分。

  4. Sloppy version

    1. 对于每个范围,取x坐标的平均值x_mean。逆坐标变换A_inv(x_mean, 0)将为您提供该范围交点的近似值。根据您的使用情况和潜在曲线的复杂程度,近似值可能已经足够好了。
    2. 复杂版

      1. 使用低度<= 4的线或多项式曲线近似每个范围。

        • 将范围的索引映射到单位间隔,例如, [103, 104, 105, 106, 107]变为[0.0, 0.25, 0.5, 0.75, 1.0]
        • 将范围数据拆分为xy坐标范围。
        • xy数据分别近似为1D函数,将曲线数据表示为(x(t), y(t))的{​​{1}}参数函数t(使用上面的映射索引作为插值结。)
        • 使用多项式求解器求解[0, 1]
        • 对于y(t) == 0内的每个零t_zero,请评估[0, 1]处的近似值x(t)。逆坐标变换t_zero为您提供原始坐标中A_inv(x(t_zero), 0)处交点的近似值。
      2. 如果您可以确认此解决方案可能适合您的问题,我可能会提供相应的t_zero示例。

答案 1 :(得分:0)

根据我上面的评论

import numpy as np

A = np.random.random((20, 2))
A[:,0] = np.arange(20)
A[:,1] = A[:,1] * (7.5 + A[:,0]) # some kind of wiggly line
p0 = [-1.0,-6.5] # point 0
p1 = [22.0, 20.0] # point 1

b = (p1[1] - p0[1]) / (p1[0] - p0[0]) # gradient
a = p0[1] - b * p0[0] # intercept
B = (a + A[:,0] * b) - A[:,1] # distance of y value from line
ix = np.where(B[1:] * B[:-1] < 0)[0] # index of points where the next point is on the other side of the line
d_ratio = B[ix] / (B[ix] - B[ix + 1]) # similar triangles work out crossing points
cross_points = np.zeros((len(ix), 2)) # empty array for crossing points
cross_points[:,0] = A[ix,0] + d_ratio * (A[ix+1,0] - A[ix,0]) # x crossings
cross_points[:,1] = A[ix,1] + d_ratio * (A[ix+1,1] - A[ix,1]) # y crossings

print(ix, B, A, cross_points)