【问题标题】:Plane fitting through points in 3D using python使用python通过3D点进行平面拟合
【发布时间】:2023-04-03 07:42:01
【问题描述】:

我在 3D 空间中有点。

       X        Y       Z
0   0.61853 0.52390 0.26304
1   0.61843 0.52415 0.26297 
2   0.62292 0.52552 0.26108 
3   0.62681 0.51726 0.25622 
4   0.62772 0.51610 0.25903 

我已经通过应该垂直划分这些点的点定义了一个平面,但它不是垂直或水平划分它们。平面和点在我绘制它们时相距甚远。

def plane_equation(x1, y1, z1, x2, y2, z2, x3, y3, z3):
    a1 = x2 - x1 
    b1 = y2 - y1 
    c1 = z2 - z1 
    a2 = x3 - x1 
    b2 = y3 - y1 
    c2 = z3 - z1 
    a = b1 * c2 - b2 * c1 
    b = a2 * c1 - a1 * c2 
    c = a1 * b2 - b1 * a2 
    d = (- a * x1 - b * y1 - c * z1) 
    return a, b, c, d

# Finding the equation of the plane
a, b, c, d = plane_equation(x0, y0, z0, x1, y1, z1, x2, y2, z2)
print("equation of plane is ", a, "x +", b, "y +", c, "z +", d, "= 0.")

x = np.arange(0, 1, 0.1)
y = np.arange(0, 1, 0.1)

X,Y = np.meshgrid(x,y)
Z = a*X + b*Y + d

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(df.x, df.y, df.z, color = 'c', marker = 'o', alpha = 0.5)
surf = ax.plot_surface(X, Y, Z)

equation of plane is  -0.0002496952000000007 x + 0.00036812320000000016 y + 0.0007697304000000002 z + -0.00024088567529317268 = 0.

我需要飞机通过这些点并且应该在垂直方向。蓝色平面应通过青色点,平面应垂直。

【问题讨论】:

  • 在此处提供您尝试的代码。不要指望 Stack Overflow 上的人会为你写下整个代码
  • @Spektre:看,这就是我要求提供代码的原因。你、我和其他人会不断猜测
  • @Spektre 我没有得到规范化向量的想法。
  • @Spektre 这就是我为点选择所做的我已经从平面方程的数据框中选择了第一个点、最后一个点和点的中点。
  • @Spektre 我明白你的意思。我正在努力解决所有问题。

标签: python-3.x matplotlib geometry


【解决方案1】:

这里有几件事可能会出错:

  1. 值太小

    您的 法线未标准化 并且其坐标的幅度非常小(0.000???),因此您的绘图可能会将所有值都处理为零(因为图像上的绘图是plane Z=0 与您提供的值无关)。

    根据您的反馈in chat 我的这个假设是正确的,所以要解决这个问题只需标准化您的正常:

    n(nx,ny,nz) /= sqrt(nx*nx + ny*ny +nz*nz) 
    

    并用这个新值计算d

    d = nx*x0 + ny*y0 + nz*z0
    

    其中(x0,y0,z0) 是选定点中的任意点。

  2. 选错点

    选择的 3 个点不能靠得太近,也不能在一条线上。如果他们这样做,计算出的法线是无效的。此外,如果您选择包含大噪声的点,则会降低准确性...

    为了改善这一点,请随机选择 3 个点计算正常。计算n 这样的法线并将它们平均在一起。 n 越高,准确率越高。

  3. 适合

    为了进一步提高准确性,您可以尝试拟合法线和d。只需使用 #1#2 中的法线并将其坐标和d 拟合在近距离范围内,以最小化所有点到平面的平均或最大距离。但是这是O(n.log^4(m)),其中n 是使用的点数,m 与每个参数的拟合范围相关,但提供了您可以获得的最佳精度。

    您可以使用二分搜索或Approximation search 或您的环境可用的任何优化器

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 2016-12-09
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    相关资源
    最近更新 更多