Я провел еще несколько исследований о том, что python, scipy и numpy могли предложить для решения этой проблемы, и я наткнулся на этот фрагмент кода, который, как оказалось, делает именно то, что мне нужно:
def calcBestNormal(points, origin):
p = np.subtract(points, origin)
# Inital guess of the plane
p0 = np.array([0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129])
def f_min(X, p):
plane_xyz = p[0:3]
distance = (plane_xyz * X.T).sum(axis=1) + p[3]
return distance / np.linalg.norm(plane_xyz)
def residuals(params, signal, X):
return f_min(X, params)
sol = leastsq(residuals, p0, args=(None, p.T))[0]
normal = np.divide(sol[0:3], np.linalg.norm(sol[0:3]))
return normal