您的位置:首页 > 其它

vtkImagePlaneWidget的平移&旋转

2015-06-23 10:29 701 查看
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?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: