728x90
1. 개요
PolyData를 단면으로 절단하면 새로운 절단된 면이 생긴다. 절단된 면은 Points 로 구성되며 같은 데이터를 이용하여 단면을 이루는 외곽선을 그릴 수 있다.
2. 구현
vtkCutter : 입력된 PolyData 를 입력된 vtkImplicitFunction을 이용하여 절단 기능을 수행한다. 절단된 된 면의 포인트와 라인을 갖는 Polydata를 생성한다.
vtkDelaunay2D : 입력된 points 데이터를 이용하여 삼각형 polygons을 생성한다.
vtkStripper : 삼각형 polydata 를 stripper 데이터로 생성한다. Stripper는 중복되는 데이터를 정리하여 메모리 소모를 줄일 수 있다. vtkCutter의 출력데이터를 입력하면 한개의 line 으로 만들고, vtkDelaunay2D의 경우에는 Triangle Strip 으로 생성한다.
public void TestSphereCutter()
{
// 입력할 PolyData 소스를 생성한다.
vtkSphereSource sph = vtkSphereSource.New();
sph.SetRadius(10);
sph.Update();
// vtkCutter 로 절단에 사용할 면을 생성한다.
vtkPlane cutterPlane = vtkPlane.New();
cutterPlane.SetNormal(0, 0, 1);
// Cutter 를 생성한다.
var cutter = vtkCutter.New();
cutter.SetCutFunction(cutterPlane);
cutter.SetInputConnection(sph.GetOutputPort());
cutter.Update();
// cutter로 생성된 point는 원의 바깥쪽으로 normal 을 갖는다. 이를 reset 한다.
var normals = cutter.GetOutput().GetPointData().GetNormals();
if (normals != null)
{
normals.SetNumberOfTuples(0);
}
// cutter 에서 만든 lines 를 한개의 line으로 만든다.
vtkStripper contourStrip = vtkStripper.New();
contourStrip.SetInputConnection(cutter.GetOutputPort());
contourStrip.Update();
// 외곽선을 위한 Mapper를 생성한다.
vtkPolyDataMapper contourMapper = vtkPolyDataMapper.New();
contourMapper.SetInputConnection(cutter.GetOutputPort());
contourMapper.InterpolateScalarsBeforeMappingOn();
contourMapper.SetScalarRange(1, 1);
// 외곽선을 그릴 Actor 를 생성한다.
vtkActor contourActor = vtkActor.New();
contourActor.SetMapper(contourMapper);
contourActor.GetProperty().SetColor(VtkColorUtils.GetNamedColor3d("Blue").ToIntPtr());
contourActor.GetProperty().SetLineWidth(3);
contourActor.GetProperty().LightingOff(); // Normal 값에 대한 lighting 효과를 없앤다. Solid 색상을 표시하게 됨
// Generate a Delaunay triangulation of the points
vtkDelaunay2D delaunayFilter = vtkDelaunay2D.New();
delaunayFilter.SetInputConnection(cutter.GetOutputPort());
delaunayFilter.Update();
// cutter 에서 만든 lines 를 한개의 line으로 만든다.
vtkStripper polygonStrip = vtkStripper.New();
polygonStrip.SetInputConnection(delaunayFilter.GetOutputPort());
polygonStrip.Update();
vtkPolyDataNormals polyNormal = vtkPolyDataNormals.New();
polyNormal.SetInputConnection(polygonStrip.GetOutputPort());
polyNormal.SetConsistency(0);
polyNormal.Update();
var polygonMapper = vtkPolyDataMapper.New();
polygonMapper.SetInputConnection(polyNormal.GetOutputPort());
polygonMapper.ScalarVisibilityOff();
var polygonActor = vtkActor.New();
polygonActor.SetMapper(polygonMapper);
polygonActor.GetProperty().SetColor(VtkColorUtils.GetNamedColor3d("Pink").ToIntPtr());
var glyphActor = VtkGlyphUtils.PointToGlyph(cutter.GetOutput().GetPoints(), 0.01);
renderer.AddActor(contourActor);
renderer.AddActor(glyphActor);
renderer.AddActor(polygonActor);
}
vtkCutter 로 출력된 polydata 이다.
DATASET POLYDATA
POINTS 16 float
9.74928 0 0 8.32153 3.44689 0 6.89378 6.89378 0
3.44689 8.32153 0 5.96971e-16 9.74928 0 -3.44689 8.32153 0
-6.89378 6.89378 0 -8.32153 3.44689 0 -9.74928 1.19394e-15 0
-8.32153 -3.44689 0 -6.89378 -6.89378 0 -3.44689 -8.32153 0
-1.79091e-15 -9.74928 0 3.44689 -8.32153 0 6.89378 -6.89378 0
8.32153 -3.44689 0
LINES 17 32
OFFSETS vtktypeint64
0 2 4 6 8 10 12 14 16
18 20 22 24 26 28 30 32
CONNECTIVITY vtktypeint64
0 1 1 2 2 3 3 4 4
5 5 6 6 7 7 8 8 9
9 10 10 11 11 12 12 13 13
14 14 15 15 0
vtkCutter를 입력하여 vtkStripper 를 수행한 Output 데이터이다. vtkCutter를 수행했을 때는 points 를 각각 line으로 연결하였지만, Stripper에서는 모든 포인트를 한개의 polygon 으로 묶고 있다.
DATASET POLYDATA
POINTS 16 float
9.74928 0 0 8.32153 3.44689 0 6.89378 6.89378 0
3.44689 8.32153 0 5.96971e-16 9.74928 0 -3.44689 8.32153 0
-6.89378 6.89378 0 -8.32153 3.44689 0 -9.74928 1.19394e-15 0
-8.32153 -3.44689 0 -6.89378 -6.89378 0 -3.44689 -8.32153 0
-1.79091e-15 -9.74928 0 3.44689 -8.32153 0 6.89378 -6.89378 0
8.32153 -3.44689 0
LINES 2 17
OFFSETS vtktypeint64
0 17
CONNECTIVITY vtktypeint64
0 1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 0
vtkDelaunay2D 로 생성된 polygons 의 output 데이터이다.
# vtk DataFile Version 5.1
vtk output
ASCII
DATASET POLYDATA
POINTS 16 float
9.74928 0 0 8.32153 3.44689 0 6.89378 6.89378 0
3.44689 8.32153 0 5.96971e-16 9.74928 0 -3.44689 8.32153 0
-6.89378 6.89378 0 -8.32153 3.44689 0 -9.74928 1.19394e-15 0
-8.32153 -3.44689 0 -6.89378 -6.89378 0 -3.44689 -8.32153 0
-1.79091e-15 -9.74928 0 3.44689 -8.32153 0 6.89378 -6.89378 0
8.32153 -3.44689 0
POLYGONS 15 42
OFFSETS vtktypeint64
0 3 6 9 12 15 18 21 24
27 30 33 36 39 42
CONNECTIVITY vtktypeint64
15 0 1 3 1 2 5 1 3
5 3 4 7 1 5 7 5 6
9 1 7 9 7 8 11 1 9
11 9 10 13 1 11 13 11 12
15 1 13 15 13 14
마지막으로 vtkDelaunay2D의 출력 데이터를 stripper 한 출력데이터이다.
# vtk DataFile Version 5.1
vtk output
ASCII
DATASET POLYDATA
POINTS 16 float
9.74928 0 0 8.32153 3.44689 0 6.89378 6.89378 0
3.44689 8.32153 0 5.96971e-16 9.74928 0 -3.44689 8.32153 0
-6.89378 6.89378 0 -8.32153 3.44689 0 -9.74928 1.19394e-15 0
-8.32153 -3.44689 0 -6.89378 -6.89378 0 -3.44689 -8.32153 0
-1.79091e-15 -9.74928 0 3.44689 -8.32153 0 6.89378 -6.89378 0
8.32153 -3.44689 0
TRIANGLE_STRIPS 7 26
OFFSETS vtktypeint64
0 5 11 14 20 23 26
CONNECTIVITY vtktypeint64
0 1 15 13 14 2 3 1 5
7 6 5 3 4 7 9 1 11
13 12 9 7 8 11 9 10
728x90
728x90