Допустим, у меня есть множество точек,Как оценить локальную касательную плоскость для трехмерных точек?
R = [[x1, y1, z1],[x2, y2, z2],...,[xn, yn, zn]]
Для каждой точки (р) в R, я определил локальную окрестность с радиусом (г) и высоты (2r) с использованием scipy.cKDTree
import numpy as np
import scipy.spatial
R = np.array(R)
r = 1 # search radius
xy = R[:,0:2] # make array of ONLY xy
tree = scipy.spatial.cKDTree(xy)
for p in range(len(R)):
2d_nbr_indices = tree.query_ball_point(xy[p], r) # indices w/in xy neighborhood
2d_nbr_array = R[2d_nbr_indices] # 3d array of 2d neighbors
z = R[p][1] # get z value
zMin = z - r
zMax = z + r
# Create boolean array to filter 3d array
hgt_filter = np.any([2d_nbr_array[:, 2] >= zMin,
2d_nbr_array[:, 2] <= zMax], axis=0)
3d_nbr_array = 2d_nbr_array[hgt_filter] # points in xyz neighborhood
Я хотел бы вычислить плоскость ортогональной регрессии для каждой окрестности, определить расстояние (ортогональное) от каждой точки до плоскости и вычислить нормальный вектор плоскости. Есть ли у кого-нибудь советы о том, как это сделать в python?
EDIT: Я нашел odr user guide. Кажется, он обрабатывает трехмерные точки. Любые рекомендации по его внедрению и использованию приветствуются. Я также нашел this similar question.
EDIT: Следует отметить, что данные могут содержать вертикальные или почти вертикальные поверхности, поэтому необходима неявная модель. Я нашел this example in the scipy codebook, но только с данными xy.
Благодарим вас за пример. Я должен был бы, вероятно, упомянуть, что мои данные могут содержать (близкие) вертикальные поверхности, поэтому я считаю, что неявная модель требуется. Не могли бы вы изменить свой ответ для использования с моим массивом R в неявной модели? – Barbarossa