三维空间中最佳拟合平面的方向

时间:2015-11-07 23:26:50

标签: python numpy matplotlib scipy geometry

我正在尝试使用python 3.4.3和Matplotlib获取在3D散点图中绘制为最佳拟合线的平面的方向。我目前将数据绘制在3D图表中,平面穿过这些点并需要一种方法来获得平面的方向。 看着它从Z轴倾斜的角度。有没有我错过的捷径只是“打印”方向角。或者是否可以从盒子的顶部到平面创建一个三角函数以获得角度。我对mathplotlib知之甚少,因此非常感谢任何帮助。

def plane(x, y, params):
    a = params[0]
    b = params[1]
    c = params[2]
    z = a*x + b*y + c
    return z

def error(params, points):
    result = 0
    for (x,y,z) in points:
        plane_z = plane(x, y, params)
        diff = abs(plane_z - z)
        result += diff**2
    return result

def cross(a, b):
    return [a[1]*b[2] - a[2]*b[1],
            a[2]*b[0] - a[0]*b[2],
            a[0]*b[1] - a[1]*b[0]]

points = [(1.1,2.1,8.1),
          (3.2,4.2,8.0),
          (5.3,1.3,8.2),
          (3.4,2.4,8.3),
          (1.5,4.5,5.0)]

fun = functools.partial(error, points=points)
params0 = [0, 0, 0]
res = scipy.optimize.minimize(fun, params0)

a = res.x[0]
b = res.x[1]
c = res.x[2]

xs, ys, zs = zip(*points)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(xs, ys, zs)

point  = np.array([0.0, 0.0, c])
normal = np.array(cross([1,0,a], [0,1,b]))
d = -point.dot(normal)
xx, yy = np.meshgrid([-5,10], [-5,10])
z = (-normal[0] * xx - normal[1] * yy - d) * 1. /normal[2]
ax.plot_surface(xx, yy, z, alpha=0.6, color=[1,1,0])

ax.set_xlim(0,10)
ax.set_ylim(0,10)
ax.set_zlim(0,10)

plt.show()

1 个答案:

答案 0 :(得分:0)

如果我没记错我的几何知识,你可以通过添加来计算与z轴的角度。

from math import acos, sqrt
cos_theta=1./sqrt(a*a+b*b+1)
theta=acos(cos_theta)

theta将是垂直于平面的矢量与以弧度表示的z轴之间的角度。例如,XY平面的θ为θ,ZY平面的θ为p / 2