基本介绍
在前一篇文章中,我们使用了vtkImageCheckerboard创建棋盘格,在鼠标移动时,围绕鼠标中心点同步显示指定大小的棋盘格。
这一章中,我们采用vtkImageRectilinearWipe实现棋盘格,更加贴近实际的使用效果。
基本流程
假设两组数据分别为image1和image2:
1、首先计算两组数据的大小包围盒((vtkImageData* image1)() 仅作为表示)
double imageBoundingBox[3];
imageBoundingBox[0] = (vtkImageData* image1)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1];
imageBoundingBox[1] = (vtkImageData* image1)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3];
imageBoundingBox[2] = (vtkImageData* image1)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5];
double overlayBoundingBox[3];
overlayBoundingBox[0] = (vtkImageData* image2)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1];
overlayBoundingBox[1] = (vtkImageData* image2)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3];
overlayBoundingBox[2] = (vtkImageData* image2)()->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5];
2、创建vtkExtractVOI 和 vtkImageRectilinearWipe
vtkSmartPointer<vtkExtractVOI> extractVOI1 = vtkSmartPointer<vtkExtractVOI>::New();
vtkSmartPointer<vtkExtractVOI> extractVOI2 = vtkSmartPointer<vtkExtractVOI>::New();
vtkSmartPointer<vtkImageRectilinearWipe> imageRectWipe = vtkSmartPointer<vtkImageRectilinearWipe>::New();
extractVOI1->SetInputConnection(data1);
extractVOI2->SetInputConnection(data2);
3、根据鼠标点击,判断视图和位置,并获取VOI数据
int currentSlicePosition[3] = { 0, 0, 0 }; //鼠标当前移动的位置(XYZ)
switch (GetSliceOrientation())
{
case vtkImageViewer2::SLICE_ORIENTATION_XY:
imageRectWipe->SetPosition(currentSlicePosition[0], currentSlicePosition[1]);
//VOI1
extractVOI1->SetVOI(0, imageBoundingBox[0], 0, imageBoundingBox[1], currentSlicePixel[2], currentSlicePixel[2]);
//VOI2
extractVOI2->SetVOI(0, imageBoundingBox[0], 0, imageBoundingBox[1], currentSlicePixel[2], currentSlicePixel[2]);
break;
case vtkImageViewer2::SLICE_ORIENTATION_XZ:
imageRectWipe->SetPosition(currentSlicePosition[0], currentSlicePosition[2]);
//VOI1
extractVOI1->SetVOI(0, imageBoundingBox[0], currentSlicePosition[1], currentSlicePosition[1], 0,imageBoundingBox[2]);
//VOI2
extractVOI2->SetVOI(0, imageBoundingBox[0], currentSlicePosition[1], currentSlicePosition[1], 0, imageBoundingBox[2]);
break;
case vtkImageViewer2::SLICE_ORIENTATION_YZ:
imageRectWipe->SetPosition(currentSlicePosition[1], currentSlicePosition[2]);
//VOI1
extractVOI1->SetVOI(currentSlicePosition[0], currentSlicePosition[0], 0, imageBoundingBox[1], 0, imageBoundingBox[2]);
//VOI2
extractVOI2->SetVOI(currentSlicePosition[0], currentSlicePosition[0], 0, imageBoundingBox[1], 0, imageBoundingBox[2]);
break;
}
extractVOI1->Update();
extractVOI2->Update();
imageRectWipe->SetInputConnection(0, extractVOI1->GetOutputPort());
imageRectWipe->SetInputConnection(1, extractVOI2->GetOutputPort());
4、 设置 wipe axes位置
//Set the location of the wipe axes
switch (orientation)
{
case 0:
imageRectWipe->SetAxis(0,1);
break;
case 1:
imageRectWipe->SetAxis(0, 2);
break;
case 2:
imageRectWipe->SetAxis(1, 2);
break;
}
5、将imageRectWipe 赋值给 vtkImageActor
(vtkImageActor*)()->GetMapper()->SetInputConnection(imageRectWipe->GetOutputPort());
6、由 vtkImageActor设置显示属性