level 9
是这样的,我在 横断面 上有一条直线,移动这条直线,
如何实时显示根据这条线进行垂直于横断面的斜切面?
2017年06月09日 05点06分
1
level 7
1, 0, 0, 0,
0, 0.866025, -0.5, 0,
0, 0.5, 0.866025, 0,
0, 0, 0, 1
拿去不谢。。
2017年06月10日 12点06分
4
...逗我?抄别人一个矩阵就放这啦!!!而且还是个固定值,感觉膝盖中了一箭
2017年06月12日 01点06分
@微尘小六 好吧 开始没明白你的意思,建议你去研究下vtkResliceCursorWidget 这个可以实现斜切的
2017年06月13日 02点06分
level 9
过体中心进行旋转的代码(vtkxxxCommand):
virtual void Execute( vtkObject *caller, unsigned long, void* )
{
vtkLineWidget *lineWidget = reinterpret_cast<vtkLineWidget*>( caller );
double dPoint1[3], dPoint2[3];
lineWidget->GetPoint1( dPoint1 );
lineWidget->GetPoint2( dPoint2 );
//Image Info
int extent[6];
double spacing[3];
double origin[3];
m_pImgData->GetExtent( extent );
m_pImgData->GetSpacing( spacing );
m_pImgData->GetOrigin( origin );
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * ( extent[0] + extent[1] );
center[1] = origin[1] + spacing[1] * 0.5 * ( extent[2] + extent[3] );
center[2] = origin[2] + spacing[2] * 0.5 * ( extent[4] + extent[5] );
//Angle
double dAngle = 0;
double dMinusX = dPoint1[0] - dPoint2[0];
double dMinusY = dPoint1[1] - dPoint2[1];
if( ( dMinusX == 0 ) && ( dMinusY > 0 ) )//除数不应为0,为矢状面,90°或270°
dAngle = 90;
else if( ( dMinusX == 0 ) && ( dMinusY < 0 ) )
dAngle = 270;
else
{
dAngle = qAtan( dMinusY / dMinusX );
//1
if( dMinusX > 0 && dMinusY > 0 )
dAngle = dAngle / 3.1415926 * 180;
//2
else if( dMinusX < 0 && dMinusY > 0 )
dAngle = dAngle / 3.1415926 * 180 + 180;
//3
else if( dMinusX < 0 && dMinusY < 0 )
dAngle = dAngle / 3.1415926 * 180 + 180;
//4
else if( dMinusX > 0 && dMinusY < 0 )
dAngle = dAngle / 3.1415926 * 180 + 360;
}
//Matrix
vtkSmartPointer<vtkMatrix4x4> rotateMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->RotateZ( dAngle );
transform->GetMatrix( rotateMatrix );
double coronalElements[16] =
{
1, 0, 0, 0,
0, 0, 1, 0,
0, -1, 0, 0,
0, 0, 0, 1
};
vtkSmartPointer<vtkMatrix4x4> coronalMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
coronalMatrix->DeepCopy( coronalElements );
vtkMatrix4x4::Multiply4x4( rotateMatrix, coronalMatrix, rotateMatrix );
vtkSmartPointer<vtkMatrix4x4> resliceAxes = vtkSmartPointer<vtkMatrix4x4>::New();
resliceAxes->DeepCopy( rotateMatrix );
resliceAxes->SetElement( 0, 3, center[0] );
resliceAxes->SetElement( 1, 3, center[1] );
resliceAxes->SetElement( 2, 3, center[2] );
//Update oblique slice
m_pReslice->SetResliceAxes( resliceAxes );
m_pReslice->Update();
m_pRenderer->Modified();
m_pRenderer->ResetCamera();
m_pRenderWindow->Modified();
m_pRenderWindow->Render();
}
2017年06月12日 09点06分
8