vtkImageReslice 切片



void CVTK01View::Slice3D()
{
	int xyz[3];
	double sp[3];
	m_vtk->m_imgData->GetDimensions(xyz);
	m_vtk->m_imgData->GetSpacing(sp);
	if(xyz[0]+xyz[1]+xyz[2]<4)
	{
		AfxMessageBox(_T("No 3D data!!!"));
		return;
	}

	pDlg->UpdateData(TRUE);
	double pos[3];
	pos[0]=(pDlg->Xposition-1)*sp[0];
	pos[1]=(pDlg->Yposition-1)*sp[1];
	pos[2]=(pDlg->Zposition-1)*sp[2];
		


//---------------------pipeline--------------------
	m_vtk->m_pMapperList[0]->SetInput(m_vtk->m_planeList[0]->GetOutput());
	m_vtk->m_pMapperList[1]->SetInput(m_vtk->m_planeList[1]->GetOutput());
	m_vtk->m_pMapperList[2]->SetInput(m_vtk->m_planeList[2]->GetOutput());
	m_vtk->m_actorList[0]  ->SetMapper(m_vtk->m_pMapperList[0]);
	m_vtk->m_actorList[1]  ->SetMapper(m_vtk->m_pMapperList[1]);
	m_vtk->m_actorList[2]  ->SetMapper(m_vtk->m_pMapperList[2]);
	m_vtk->m_actorList[0]  ->SetTexture(m_vtk->m_atext1);
	m_vtk->m_actorList[1]  ->SetTexture(m_vtk->m_atext2);
	m_vtk->m_actorList[2]  ->SetTexture(m_vtk->m_atext3);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[0]);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[1]);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[2]);

//---------------------Reslice --------------------
	m_vtk->reslicex->SetInput(m_vtk->m_imgData);
	m_vtk->reslicey->SetInput(m_vtk->m_imgData);
	m_vtk->reslicez->SetInput(m_vtk->m_imgData);

	m_vtk->reslicez->SetResliceAxesDirectionCosines(	//ZSlice指向原始z軸,切片爲原來的xoy平面
							1, 0, 0,		//          z
							0, 1, 0,		//	  ↗
							0, 0, 1			//        →x
							);			//       ↓
	m_vtk->reslicez->InterpolateOn();					//       y 
	m_vtk->reslicez->SetInterpolationModeToLinear();
	m_vtk->reslicez->SetResliceAxesOrigin(pos[0],pos[1],pos[2]);
	m_vtk->reslicez->SetOutputDimensionality(2);
	m_vtk->m_atext1->SetInput(m_vtk->reslicez->GetOutput());

	m_vtk->reslicey->SetResliceAxesDirectionCosines(	//ZSlice指向原始y軸反向,切片爲原來的xoz平面
							1, 0, 0,		//       z  y
							0, 0, -1,		//	↑↗
							0, 1, 0			//        →x
							);			//
	m_vtk->reslicey->InterpolateOn();					// 
	m_vtk->reslicey->SetInterpolationModeToLinear();
	m_vtk->reslicey->SetResliceAxesOrigin(pos[0],pos[1],pos[2]);
	m_vtk->reslicey->SetOutputDimensionality(2);
	m_vtk->m_atext2->SetInput(m_vtk->reslicey->GetOutput());

	m_vtk->reslicex->SetResliceAxesDirectionCosines(	//ZSlice指向原始x軸反向,切片爲原來的zoy平面
							0, 0, -1,		//         x
							0, 1, 0,		//	↗
							1, 0, 0			//    z←
							);			//      ↓ 
	m_vtk->reslicex->InterpolateOn();					//	y
	m_vtk->reslicex->SetInterpolationModeToLinear();
	m_vtk->reslicex->SetResliceAxesOrigin(pos[0],pos[1],pos[2]);
	m_vtk->reslicex->SetOutputDimensionality(2);
	m_vtk->m_atext3->SetInput(m_vtk->reslicex->GetOutput());

//---------------------set plane position--------------------
	m_vtk->m_planeList[0]->SetXResolution(xyz[0]);//切片xoy面平行於原來的xoy
	m_vtk->m_planeList[0]->SetYResolution(xyz[1]);
	//m_vtk->m_planeList[0]->SetNormal(0,0,1);	//根據下面三個點就可以確定此法向量
	m_vtk->m_planeList[0]->SetOrigin(0,0,0);
	m_vtk->m_planeList[0]->SetPoint1(   (xyz[0]-1)*sp[0],0,0);
	m_vtk->m_planeList[0]->SetPoint2(0,(xyz[1]-1)*sp[1],0);
	m_vtk->m_planeList[0]->Push(pos[2]);


	m_vtk->m_planeList[1]->SetXResolution(xyz[0]);//切片xoy面平行於原來的xoz
	m_vtk->m_planeList[1]->SetYResolution(xyz[2]);
	//m_vtk->m_planeList[1]->SetNormal(0,-1,0);
	m_vtk->m_planeList[1]->SetOrigin(0,0,(xyz[2]-1)*sp[2]);
	m_vtk->m_planeList[1]->SetPoint1((xyz[0]-1)*sp[0],0,(xyz[2]-1)*sp[2]);
	m_vtk->m_planeList[1]->SetPoint2(0,0,0);
	m_vtk->m_planeList[1]->Push(pos[1]);

	m_vtk->m_planeList[2]->SetXResolution(xyz[2]);//切片xoy面平行於原來的zoy
	m_vtk->m_planeList[2]->SetYResolution(xyz[1]);
	//m_vtk->m_planeList[2]->SetNormal(-1,0,0);
	m_vtk->m_planeList[2]->SetOrigin(0,0,(xyz[2]-1)*sp[2]);
	m_vtk->m_planeList[2]->SetPoint1(0,0,0);
	m_vtk->m_planeList[2]->SetPoint2(0,(xyz[1]-1)*sp[1],(xyz[2]-1)*sp[2]);
	m_vtk->m_planeList[2]->Push(pos[0]);
	
	m_vtk->m_ren->GetViewProps()->RemoveAllItems();
	m_vtk->m_ren->AddActor(m_vtk->m_axesactorC);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[0]);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[1]);
	m_vtk->m_ren->AddActor(m_vtk->m_actorList[2]);
	m_vtk->m_renWin->Render();

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章