<p>下面是我编写的一些代码,它涵盖了问题的第一部分,即从点集合中查找和定义“曲面”</p>
<p>任何平面(平面)都可以用公式定义,其中a、b、c是系数,d是常数。我们可以将其写入如下函数:</p>
<pre><code>def linear_plane(data, a, b, c):
x = data[0]
y = data[1]
z = data[2]
return (a * x) + (b * y) + (c*z)
</code></pre>
<p>然后,在一些导入之后,我们可以使用scipy的curve_fit搜索并找到最适合每个数组的函数的参数。curve_fit接受<code>linear_plane</code>函数的输入值,并尝试调整a、b、c,以便该函数的结果与包含大量<code>-1</code>的a列表匹配。这来自于重新排列方程,其中<em><strong>d</strong></em>=1</p>
<pre><code>from scipy.optimize import curve_fit
v1,err1 = curve_fit(linear_plane,arr_1.T,np.repeat(-1,len(arr_1)))
v2,err2 = curve_fit(linear_plane,arr_2.T,np.repeat(-1,len(arr_2)))
</code></pre>
<p>其中<code>v1</code>,<code>v2</code>中的每一个都是系数a、b、c,它们最接近地定义了您所讨论的两个平面<code>err1</code>和<code>err2</code>显示剩余的“错误”,因此如果这些错误太大,请小心</p>
<p>现在找到了系数,您可以使用它们来可视化两个平面:</p>
<pre><code>%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(xs=arr_1[:,0], ys=arr_1[:,1], zs=arr_1[:,2], c="blue")
ax.scatter3D(xs=arr_2[:,0], ys=arr_2[:,1], zs=arr_2[:,2], c="red")
xx1, yy1 = np.meshgrid([min(arr_1[:,0]),max(arr_1[:,0])],[min(arr_1[:,1]),max(arr_1[:,1])])
xx2, yy2 = np.meshgrid([min(arr_2[:,0]),max(arr_2[:,0])], [min(arr_2[:,1]),max(arr_2[:,1])])
# Use the coefficients in v1[0], v1[1], v1[2] to calculate z-values for all xx/yy values
z1 = (-v1[0] * xx1 - v1[1] * yy1 - 1) * 1. /v1[2]
# Use the coefficients in v2[0], v2[1], v2[2] to calculate z-values for all xx/yy values
z2 = (-v2[0] * xx2 - v2[1] * yy2 - 1) * 1. /v2[2]
# Using xx,yy and z values, plot the surfaces fit into the graph.
ax.plot_surface(xx1, yy1, z1, alpha=0.2, color=[0,0,1])
ax.plot_surface(xx2, yy2, z2, alpha=0.2, color=[1,0,0])
</code></pre>
<p>在这里,我们为每个平面的最大和最小边界内的所有x和y计算一组z值,然后将其绘制为显示交点的曲面:</p>
<p><a href="https://i.stack.imgur.com/Ao5nd.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Ao5nd.png" alt="enter image description here"/></a></p>
<p>我注意到<a href="https://stackoverflow.com/users/2988730/mad-physicist">Mad Physicist </a>刚刚发布了一个更完整的答案,所以现在就把这个留在这里。我想做的一件事是扩展曲面拟合,这样平面就不必是线性的,就像一个类似于3d多项式的函数,它应该是一个替换<code>curve_fit</code>调用中使用的函数的例子</p>
<p>这里缺少的另一部分是如何计算描述这两个平面交叉位置的直线方程,我相信在另一个(更好的)答案中可以找到</p>