VTK版本:6.2.0
1 背景
使用vtkImagePlaneWidget可以对三维体数据进行虚拟切片交互提取,然而,有些时候我们希望通过代码来实现vtkImagePlaneWidget的plane的设置,例如源点设置,中心点设置以及法向量设置等。
2 平移
有时候希望对plane进行平移,使其中心点移动到指定的位置。vtkImagePlaneWidget并没有提供直接的plane平移方法,只能通过间接的方式来实现。根据参考资料[1]的提示,下面总结了实现平移的代码:
double selPt[3] = {1, 0, 0}; // 平移的目标位置
double center[3];
imagePlaneWidget->GetCenter( center );
vtkSmartPointer <vtkTransform> transform =
vtkSmartPointer <vtkTransform>::New();
transform->Translate( selPt[0] - center[0],
selPt[1] - center[1],
selPt[2] - center[2]);
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint( imagePlaneWidget->GetPoint1(), newpt );
imagePlaneWidget->SetPoint1( newpt );
transform->TransformPoint( imagePlaneWidget->GetPoint2(), newpt );
imagePlaneWidget->SetPoint2( newpt );
transform->TransformPoint( imagePlaneWidget->GetOrigin(), newpt );
imagePlaneWidget->SetOrigin( newpt );
imagePlaneWidget->UpdatePlacement();
3 旋转
有时候我们希望设定plane的法向量,这可以通过旋转来实现。
double normal[3];
imagePlaneWidget->GetNormal( normal );
double dir[3] = {1, 1, 0};
double axis[3];
double angle = vtkMath::AngleBetweenVectors(normal, dir) / vtkMath::Pi() * 180;
vtkMath::Cross( normal, dir, axis );
transform->RotateWXYZ(angle, axis);
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint( imagePlaneWidget->GetPoint1(), newpt );
imagePlaneWidget->SetPoint1( newpt );
transform->TransformPoint( imagePlaneWidget->GetPoint2(), newpt );
imagePlaneWidget->SetPoint2( newpt );
transform->TransformPoint( imagePlaneWidget->GetOrigin(), newpt );
imagePlaneWidget->SetOrigin( newpt );
imagePlaneWidget->UpdatePlacement();
参考资料