Плоскость прохождения точек в 3D с использованием Python - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть точки в трехмерном пространстве.

       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.

Мне нужна плоскость, чтобы пройти через эти точки и должна быть в вертикальном направлении.Синяя плоскость должна проходить через голубые точки, а плоскость должна быть в вертикальном направлении.

1 Ответ

0 голосов
/ 10 декабря 2018

Здесь есть несколько вещей, которые могут пойти не так:

  1. слишком маленькие значения

    Ваш нормальный не нормализован и его координаты очень малы (0.000???), поэтому возможно, что ваш график обрабатывает все значения как ноль (поскольку график на вашем изображении имеет плоскость Z=0, которая не имеет ничего общего с указанными вами значениями)

    Из ваших отзывов в чате Это мое предположение было правильным, поэтому для решения этой проблемы просто нормализуйте ваше обычное значение:

    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. Fit

    Чтобы еще больше повысить точность, вы можете попытаться соответствовать нормальному и d,просто используя нормальное от # 1 или # 2 и поместите его координаты и d в ближнем диапазоне, чтобы минимизировать среднее или максимальное расстояние всех точек до плоскости.Однако это O(n.log^4(m)), где n - это число используемых точек, а m относится к установленному диапазону каждого параметра, но обеспечивает наилучшую точность, которую вы можете получить.

    Вы можете использовать двоичный поиск или Поиск по приближению или любой другой оптимизатор, которым располагает ваша среда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...