2012-02-01 18 views
2

私はvtkの設定点からサーフェスを作成しました。今度は、面を通る平面を切断し、vtkImageDataとして出力できる2D輪郭を作成する必要があります。私は、飛行機に投影するだけのコードを作っています。誰も私が間違って何をしているのか教えてもらえますか?vtkpolydataからスライス輪郭を作る方法

vtkSphereSource sphereSource = vtkSphereSource.New(); 
sphereSource.SetPhiResolution(30); 
sphereSource.SetThetaResolution(30); 
sphereSource.SetCenter(40, 40, 0); 
sphereSource.SetRadius(20); 


vtkDataSetSurfaceFilter surfaceFilter = vtkDataSetSurfaceFilter.New(); 
surfaceFilter.SetInputConnection(sphereSource.GetOutputPort()); 
surfaceFilter.Update(); 

// generate circle by cutting the sphere with an implicit plane 
// (through its center, axis-aligned) 
vtkCutter circleCutter = vtkCutter.New(); 
circleCutter.SetInputConnection(sphereSource.GetOutputPort()); 

vtkPlane cutPlane = vtkPlane.New(); 
double[] Origin = sphereSource.GetCenter(); 
cutPlane.SetOrigin(Origin[0], Origin[1], Origin[2]); 
cutPlane.SetNormal(0, 0, 1); 

circleCutter.SetCutFunction(cutPlane); 

vtkStripper stripper = vtkStripper.New(); 
stripper.SetInputConnection(circleCutter.GetOutputPort()); // valid circle 
stripper.Update(); 
// that's our circle 
vtkPolyData circle = stripper.GetOutput(); 


// prepare the binary image's voxel grid 
vtkImageData whiteImage = vtkImageData.New(); 

double[] bounds; 
bounds = circle.GetBounds(); 

whiteImage.SetNumberOfScalarComponents(1); 
// whiteImage.SetScalarTypeToChar(); 
whiteImage.SetScalarType(3); 
whiteImage.SetSpacing(.5, .5, .5); 

// compute dimensions 
int[] dim = new int[3]; 
for (int i = 0; i < 3; i++) 
{ 
    dim[i] = (int)Math.Ceiling((bounds[i * 2 + 1] - bounds[i * 2])/.5) + 1; 
    if (dim[i] < 1) 
     dim[i] = 1; 
} 
whiteImage.SetDimensions(dim[0], dim[1], dim[2]); 
whiteImage.SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1); 

whiteImage.SetOrigin(bounds[0], bounds[2], bounds[4]); 

whiteImage.AllocateScalars(); 

// fill the image with foreground voxels: 
byte inval = 255; 
byte outval = 0; 
int count = whiteImage.GetNumberOfPoints(); 
for (int i = 0; i < count; ++i) 
{ 
    whiteImage.GetPointData().GetScalars().SetTuple1(i, inval); 
} 

// sweep polygonal data (this is the important thing with contours!) 
vtkLinearExtrusionFilter extruder = vtkLinearExtrusionFilter.New(); 
extruder.SetInput(circle); ///todo warning this maybe setinputconnection 

extruder.SetScaleFactor(1.0); 
extruder.SetExtrusionTypeToNormalExtrusion(); 
extruder.SetVector(0, 0, 1); 
extruder.Update(); 

// polygonal data -. image stencil: 
vtkPolyDataToImageStencil pol2stenc = vtkPolyDataToImageStencil.New(); 
pol2stenc.SetTolerance(0); // important if extruder.SetVector(0, 0, 1) !!! 
pol2stenc.SetInputConnection(extruder.GetOutputPort()); 
pol2stenc.SetOutputOrigin(bounds[0], bounds[2], bounds[4]); 
pol2stenc.SetOutputSpacing(.5, .5, .5); 

int[] Extent = whiteImage.GetExtent(); 
pol2stenc.SetOutputWholeExtent(Extent[0], Extent[1], Extent[2], Extent[3], Extent[4], Extent[5]); 
pol2stenc.Update(); 

// cut the corresponding white image and set the background: 
vtkImageStencil imgstenc = vtkImageStencil.New(); 
imgstenc.SetInput(whiteImage); 
imgstenc.SetStencil(pol2stenc.GetOutput()); 

imgstenc.ReverseStencilOff(); 
imgstenc.SetBackgroundValue(outval); 
imgstenc.Update(); 

vtkImageData stencil = imgstenc.GetOutput(); 
int[] Dims = stencil.GetDimensions(); 
int[,] DataMap = new int[Dims[0], Dims[1]]; 

答えて

2

私はあなたが正しく輪郭を取得していると思う:http://www.vtk.org/Wiki/VTK/Examples/Cxx/Filtering/ContoursFromPolyData - 今、あなたはどのように画像として出力する輪郭を期待していますか? 「輪郭上のピクセル」をある値に設定し、「輪郭にないピクセル」を別の値に設定したいだけですか?これはどう? http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataContourToImageData