2017-11-25 7 views
0

를 VTK (파이썬)에 고르게 분포 영역을 만들고 싶어, 내가 VTK에 고르게 분포 영역난 당신이 제목에서 볼 수 있듯이

먼저 (파이썬)를 만들고 싶어, 나는이다이 링크 "Evenly distributing n points on a sphere"을 보았다 메서드를 사용하여 고르게 분포 된 구체를 만듭니다. 이 링크를 통해 균등하게 분포 된 구의 x, y, z 좌표를 얻었다.

둘째, 실제로 해결해야 할 문제가 아닙니다. 문제는 I은 X, Y, 균일하게 분포 된 구형의 Z 좌표가있는 경우에도, I는 오류가 발생하지 않는다 .. VTK (파이썬)에서

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을하지만 polydata 수 없다 내 vtk 창에서 일어나지 않았다 이 문제를 해결하려면 어떻게해야합니까?

- 태영.

+0

PolyData를 작성하는 코드를 최소한 제공 할 수 있습니까? 귀하의 숙제이며, 귀하가 어디에 갇혀 있는지 우리에게 말하면 우리는 당신을 도울 수 있습니다. 그러나 우리에게 완전한 해결책을 기대하는 것은 공정하지 않습니다. –

+0

죄송합니다. 질문을하는 것은 이번이 처음입니다. 내 질문에 더 자세히 설명해 드리겠습니다. –

답변

3

좋은 결과. 구형 polydata에 점을 추가 했으므로 점에서 곡면을 생성해야합니다. 필터는 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() 
+0

고맙습니다 !!!!!! 그게 정확히 내가 원한거야 !!!!!! –