【请教】如何根据横断面上的一条直线进行斜切面显示?
vtk吧
全部回复
仅看楼主
level 9
微尘小六 楼主
是这样的,我在 横断面 上有一条直线,移动这条直线,
如何实时显示根据这条线进行垂直于横断面的斜切面?
2017年06月09日 05点06分 1
level 9
微尘小六 楼主
左上为横断面与直线,
左下为斜切面,
右边为三维体。
2017年06月09日 05点06分 2
level 7
用vtkImageReslice
2017年06月09日 06点06分 3
额,是的。用vtkImageReslice取的断层面和斜切面。不过怎么取这个斜切面对应的矩阵[吐舌]
2017年06月10日 02点06分
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
微尘小六 楼主
2017年06月12日 09点06分 7
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
level 9
微尘小六 楼主
效果如此图。这是我旋转直线,得到的过体中心的任意角度的切面。
然后,我怎么得到过这条直线的垂直于断层面的切面啊?很明显过这条线的面不过体中心
2017年06月12日 09点06分 9
不明觉厉,这是不是需要考虑不同显示部分实时共享事件啊,刚入门,还帮不上忙
2017年06月13日 06点06分
@visual_nyb 额,不是。我是想显示任意斜切面,不是那个三视图联动显示
2017年06月13日 07点06分
level 1
我也想实现这样的功能,楼主实现没?
2017年07月12日 07点07分 10
实现了一半。明天把代码贴出来。但愿我不会忘[黑线]
2017年07月13日 15点07分
我是结合NDI能实现切割了,但是不知道切的是否是想要的方向
2017年07月14日 02点07分
@BIT_Wen 好吧,我果然忘了[汗]可以在Amide上看一下,相同条件下是否一样,一样的话就说明你做对了[哈哈]
2017年07月14日 23点07分
如何鼠标控制物体只能左右转动
2018年08月08日 07点08分
1