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