在python中的平面平面交叉

时间:2018-01-06 11:25:05

标签: python computational-geometry intersection plane

我需要以AX + BY + CZ + D = 0的形式计算两个平面的交点,并以两个(x,y,z)点的形式得到一条线。我知道怎么做数学,但我想避免发明一辆自行车并使用有效和经过测试的东西。是否有任何库已经实现了这个?试图搜索opencv和谷歌,但没有成功。

3 个答案:

答案 0 :(得分:1)

我的numpy解决方案:

def plane_intersect(a, b):
    """
    a, b   4-tuples/lists
           Ax + By +Cz + D = 0
           A,B,C,D in order  

    output: 2 points on line of intersection, np.arrays, shape (3,)
    """
    a_vec, b_vec = np.array(a[:3]), np.array(b[:3])

    aXb_vec = np.cross(a_vec, b_vec)

    A = np.array([a_vec, b_vec, aXb_vec])
    d = np.array([-a[3], -b[3], 0.]).reshape(3,1)

# could add np.linalg.det(A) == 0 test to prevent linalg.solve throwing error

    p_inter = np.linalg.solve(A, d).T

    return p_inter[0], (p_inter + aXb_vec)[0]


a, b = (1, -1, 0, 2), (-1, -1, 1, 3)
plane_intersect(a, b)

Out[583]: (array([ 0.,  2., -1.]), array([-1.,  1., -3.]))

一个测试,subs指回来:

p1, p2 = plane_intersect(a, b)
a_vec, b_vec = np.array(a[:3]), np.array(b[:3])

(np.dot(p1, a_vec), np.dot(p2, a_vec), np.dot(p1, b_vec), np.dot(p2, b_vec))
Out[585]: (-2.0, -2.0, -3.0, -3.0)

答案 1 :(得分:0)

这是通过基本向量计算解决的,并不足以实现库实现。用Numpy计算数学。

线方向由两个法向量(A,B,C)的叉积给出,并且足以找到单个点,例如两个给定平面的交点和与线方向正交的平面并通过原点(通过解决3x3系统)。

对于平行平面,计算当然会失败,并且对于几乎平行的平面而言在数值上是不稳定的,但我认为你无能为力。

答案 2 :(得分:-1)

最后,我重新使用了sympy库,将Ax + By + Cz + D = 0等式转换为(n,pt)公式:

def planeCoeffToPoint(n,d):
    nabs = [abs(i) for i in n]
    i=nabs.index(max(nabs))
    r=[0,0,0]
    r[i]=-d/n[i]
    return r

import sympy as sp
n1=(A1,B1,C1)
D1=...
n2=(A2,B2,C2)
D2=...
pt1=planeCoeffToPoint(n1,D1)
pt2=planeCoeffToPoint(n2,D2)
pl1 = sp.Plane(pt1, normal_vector=n1)
pl2 = sp.Plane(pt2, normal_vector=n2)
r=pl1.intersection(pl2)
rp1=r[0].points[0]
rp2=r[0].points[1]
[float(rp1[0]), float(rp1[1]), float(rp1[2])] # first point on line
[float(rp2[0]), float(rp2[1]), float(rp2[2])] # second point on line

你必须显式调用float(),因为sympy可能返回Zero或Rational对象,代表float。