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();
参考资料
[1]vtkImagePlaneWidget: how to update plane's orientation?