Самолет ВТК через 3D точки - PullRequest
0 голосов
/ 04 мая 2020

У меня есть набор трехмерных точек, и мне нужно соответствовать наилучшей плоскости подгонки, которую я делаю со следующим кодом (найден в stackoverflow):

points = np.reshape(points, (np.shape(points)[0], -1))
assert points.shape[0] <= points.shape[1], "There are only {} points in {} dimensions.".format(points.shape[1], points.shape[0])

ctr = points.mean(axis=1)
x = points - ctr[:, np.newaxis]
M = np.dot(x, x.T)
return ctr, svd(M)[0][:,-1] # return point and normal vector

После этого я хочу отобразить плоскость в VTK , Проблема в том, что мне нужно масштабировать самолет, но когда я это делаю, самолет тоже переводится. Как я могу предотвратить это?

def create_vtk_plane_actor(point, normal_vector):
 print("\n Display plane with point: %s and vector: %s" % (point, normal_vector))

 plane_source = vtk.vtkPlaneSource()
 plane_source.SetOrigin(point[0], point[1], point[2])
 plane_source.SetNormal(normal_vector[0], normal_vector[1], normal_vector[2])
 plane_source.Update()

 transform = vtk.vtkTransform()
 transform.Scale(1.5, 1.5, 1.0)

 transform_filter = vtk.vtkTransformFilter()
 transform_filter.SetInputConnection(plane_source.GetOutputPort())
 transform_filter.SetTransform(transform)

 actor = vtk.vtkActor()

 mapper = vtk.vtkPolyDataMapper()
 mapper.SetInputConnection(transform_filter.GetOutputPort())

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Подгонка плоскостей является встроенной функцией vtkplotter , масштабирование выполняется с помощью mesh.scale():

from vtkplotter import *
from vtkplotter import datadir
from vtkplotter.pyplot import histogram

plt = Plotter()

apple = load(datadir+"apple.ply").subdivide().addGaussNoise(1)
plt += apple.alpha(0.1)

variances = []
for i, p in enumerate(apple.points()):
    pts = apple.closestPoint(p, N=12) # find the N closest points to p
    plane = fitPlane(pts)             # find the fitting plane and scale
    variances.append(plane.variance)
    if i % 400: continue
    print(i, plane.variance)
    plt += plane.scale(2)
    plt += Points(pts)              
    plt += Arrow(plane.center, plane.center+plane.normal/10)

plt += histogram(variances).scale(6).pos(1.2,.2,-1)
plt.show()

enter image description here

0 голосов
/ 04 мая 2020

Шкала применяется не к некоторым координатам, локальным для вашего плана, а к тем, которые вы установили. Так что, действительно, центр будет двигаться. Если вы хотите разрешить это, вам нужно установить Translate в вашем преобразовании.

...