我想在 vtk 中制作均匀分布的球体 (python)
I want to make evenly distributed sphere in vtk (python)
如标题所示,我想在vtk中制作均匀分布的球体(python)
首先,我看到了这个link“Evenly distributing n points on a sphere”,这是一种创建均匀分布球体的方法。通过那个link,我得到了均匀分布球体的x,y,z坐标。
其次,这其实不是我要解决的问题。问题是即使我有均匀分布的球体的 x、y、z 坐标,我也无法在 vtk(python)..
处制作多数据
import numpy as np
import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
import vtk
from scipy.spatial import Delaunay
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x, y, z = np.cos(theta) * np.sin(phi), np.sin(theta) * np.sin(phi), np.cos(phi);
# x,y,z is coordination of evenly distributed shpere
# I will try to make poly data use this x,y,z
points = vtk.vtkPoints()
for i in range(len(x)):
array_point = np.array([x[i], y[i], z[i]] )
points.InsertNextPoint(x[i],y[i],z[i])
# tri = Delaunay(points) (Do I have to use this function??)
poly = vtk.vtkPolyData()
poly.SetPoints(points)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(poly)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Start()
代码没有抛出任何错误,但是 polydata 没有出现在我的 vtk window,
我应该怎么做才能解决这个问题?
-泰英
干得好。现在您已经将点添加到球体多数据中,我们需要从这些点生成一个表面。我们使用 vtkDelaunay3D
过滤器来做到这一点。它将生成四面体的 3D 网格。因此,要获得实际的球面,我们必须使用 vtkDataSetSurfaceFilter
提取表面。这些是在下面完成的:
import numpy as np
import vtk
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x, y, z = np.cos(theta) * np.sin(phi), np.sin(theta) * np.sin(phi), np.cos(phi);
# x,y,z is coordination of evenly distributed shpere
# I will try to make poly data use this x,y,z
points = vtk.vtkPoints()
for i in range(len(x)):
array_point = np.array([x[i], y[i], z[i]] )
points.InsertNextPoint(x[i],y[i],z[i])
poly = vtk.vtkPolyData()
poly.SetPoints(points)
# To create surface of a sphere we need to use Delaunay triangulation
d3D = vtk.vtkDelaunay3D()
d3D.SetInputData( poly ) # This generates a 3D mesh
# We need to extract the surface from the 3D mesh
dss = vtk.vtkDataSetSurfaceFilter()
dss.SetInputConnection( d3D.GetOutputPort() )
dss.Update()
# Now we have our final polydata
spherePoly = dss.GetOutput()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(spherePoly)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Start()
PyVista 让这变得非常简单:
import numpy as np
import pyvista as pv
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x = np.cos(theta) * np.sin(phi)
y = np.sin(theta) * np.sin(phi)
z = np.cos(phi)
point_cloud = pv.PolyData(np.c_[x, y, z])
surface = point_cloud.delaunay_3d().extract_surface()
surface.plot(show_edges=True, color=True, show_grid=True)
如标题所示,我想在vtk中制作均匀分布的球体(python)
首先,我看到了这个link“Evenly distributing n points on a sphere”,这是一种创建均匀分布球体的方法。通过那个link,我得到了均匀分布球体的x,y,z坐标。
其次,这其实不是我要解决的问题。问题是即使我有均匀分布的球体的 x、y、z 坐标,我也无法在 vtk(python)..
处制作多数据import numpy as np
import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
import vtk
from scipy.spatial import Delaunay
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x, y, z = np.cos(theta) * np.sin(phi), np.sin(theta) * np.sin(phi), np.cos(phi);
# x,y,z is coordination of evenly distributed shpere
# I will try to make poly data use this x,y,z
points = vtk.vtkPoints()
for i in range(len(x)):
array_point = np.array([x[i], y[i], z[i]] )
points.InsertNextPoint(x[i],y[i],z[i])
# tri = Delaunay(points) (Do I have to use this function??)
poly = vtk.vtkPolyData()
poly.SetPoints(points)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(poly)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Start()
代码没有抛出任何错误,但是 polydata 没有出现在我的 vtk window, 我应该怎么做才能解决这个问题?
-泰英
干得好。现在您已经将点添加到球体多数据中,我们需要从这些点生成一个表面。我们使用 vtkDelaunay3D
过滤器来做到这一点。它将生成四面体的 3D 网格。因此,要获得实际的球面,我们必须使用 vtkDataSetSurfaceFilter
提取表面。这些是在下面完成的:
import numpy as np
import vtk
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x, y, z = np.cos(theta) * np.sin(phi), np.sin(theta) * np.sin(phi), np.cos(phi);
# x,y,z is coordination of evenly distributed shpere
# I will try to make poly data use this x,y,z
points = vtk.vtkPoints()
for i in range(len(x)):
array_point = np.array([x[i], y[i], z[i]] )
points.InsertNextPoint(x[i],y[i],z[i])
poly = vtk.vtkPolyData()
poly.SetPoints(points)
# To create surface of a sphere we need to use Delaunay triangulation
d3D = vtk.vtkDelaunay3D()
d3D.SetInputData( poly ) # This generates a 3D mesh
# We need to extract the surface from the 3D mesh
dss = vtk.vtkDataSetSurfaceFilter()
dss.SetInputConnection( d3D.GetOutputPort() )
dss.Update()
# Now we have our final polydata
spherePoly = dss.GetOutput()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(spherePoly)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
ren.AddActor(actor)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Start()
PyVista 让这变得非常简单:
import numpy as np
import pyvista as pv
num_pts = 1000
indices = np.arange(0, num_pts, dtype=float) + 0.5
phi = np.arccos(1 - 2*indices/num_pts)
theta = np.pi * (1 + 5**0.5) * indices
x = np.cos(theta) * np.sin(phi)
y = np.sin(theta) * np.sin(phi)
z = np.cos(phi)
point_cloud = pv.PolyData(np.c_[x, y, z])
surface = point_cloud.delaunay_3d().extract_surface()
surface.plot(show_edges=True, color=True, show_grid=True)