vtkpolydata的单元Id和法向量如何获取

vtkpolydata的单元Id和法向量如何获取,第1张

#include <vtkSmartPointerh>

#include <vtkPointsh>

#include <vtkPolyDatah>

#include <vtkIdListh>

#include <vtkKdTreePointLocatorh>

int main(int, char [])

{

// Setup point coordinates

double x[3] = {10, 00, 00};

double y[3] = {00, 10, 00};

double z[3] = {00, 00, 10};

#define VTK_USE_ANSI_STDLIB 

#pragma warning( disable : 4996) 

  

  

#include <vtkRendererh> 

#include <vtkRenderWindowh> 

#include <vtkRenderWindowInteractorh> 

#include <vtkPropertyh> 

#include <vtkCamerah> 

  

#include <vtkPiecewiseFunctionh> 

#include <vtkColorTransferFunctionh> 

#include <vtkVolumePropertyh> 

#include <vtkVolumeRayCastCompositeFunctionh> 

#include <vtkVolumeRayCastMapperh> 

#include <vtkVolumeh> 

#include <vtkImageDatah> 

#include <vtkVolumeTextureMapper2Dh> 

#include <vtkPlaneh> 

#include <vtkOutlineFilterh> 

#include <vtkBoxWidgeth> 

#include <vtkPolyDataMapperh> 

#include <vtkPropertyh> 

#include <vtkCommandh> 

#include <vtkPlanesh> 

#include <vtkVolumeTextureMapper2Dh> 

#include <vtkImageResliceh> 

#include <vtkMatrix4x4h> 

#include <vtkTransformh> 

#include <vtkImageViewerh> 

  

#include <mathh> 

  

unsigned char data; 

  

float xMax = 0; 

float xMin = 0; 

  

float yMax = 0; 

float yMin = 0; 

  

float zMax = 0; 

float zMin = 0; 

  

int xDim = 0; 

int yDim = 0; 

int zDim = 0; 

  

int xStep = 0; 

int yStep = 0; 

int zStep = 0; 

  

void fBuildTestData() 

     xDim = yDim = zDim = 10; 

     xStep = yStep = zStep = 1; 

  

     data = new unsigned char[xDim  yDim  zDim]; 

  

     int value = 0; 

  

     for (int iz = 0; iz < 10; iz++) 

     { 

         for (int iy = 0; iy < 10; iy++) 

         { 

             for (int ix = 0; ix < 10; ix++) 

             { 

                 data[iz  xDim yDim + iy xDim + ix] = value; 

             } 

         } 

         value += 1; 

     } 

  

//main function 

int main(int, char argv) 

     fBuildTestData(); 

  

     vtkRenderer ren1 = vtkRenderer::New();     

  

     vtkRenderWindow renWin = vtkRenderWindow::New(); 

     renWin->AddRenderer(ren1); 

  

     vtkRenderWindowInteractor iren = vtkRenderWindowInteractor::New(); 

     iren->SetRenderWindow(renWin); 

  

     //////////////////////////////////////////////////////////////////////////     

  

     // create the image data 

     vtkImageData image = vtkImageData::New(); 

     image->SetDimensions(zDim, yDim, xDim); 

     image->SetSpacing(xStep, yStep, zStep); 

     image->SetOrigin(5, 5, 5); 

     image->SetExtent(0, xDim - 1, 0, yDim - 1, 0, zDim - 1); 

     image->SetScalarType(VTK_UNSIGNED_CHAR); 

     image->SetNumberOfScalarComponents(1); 

     image->AllocateScalars(); 

  

     unsigned char ptr = (unsigned char )image->GetScalarPointer();     

  

     // !! 将Data数据转化到image中去 !! 

     memcpy(ptr, data, xDimyDimzDim); 

  

     vtkPiecewiseFunction opacityTransferFunction = vtkPiecewiseFunction::New(); 

     opacityTransferFunction->AddPoint(0, 1); 

     opacityTransferFunction->AddPoint(1, 1);     

  

     vtkColorTransferFunction colorTransferFunction = vtkColorTransferFunction::New();     

     colorTransferFunction->AddRGBPoint(00, 10, 10, 10); 

     colorTransferFunction->AddRGBPoint(10, 01, 02, 04); 

     colorTransferFunction->AddRGBPoint(20, 0, 1, 0); 

     colorTransferFunction->AddRGBPoint(30, 04, 02, 0); 

     colorTransferFunction->AddRGBPoint(40, 02, 04, 0); 

     colorTransferFunction->AddRGBPoint(50, 02, 04, 1); 

     colorTransferFunction->AddRGBPoint(60, 0, 0, 1); 

     colorTransferFunction->AddRGBPoint(70, 1, 0, 1); 

     colorTransferFunction->AddRGBPoint(80, 1, 0, 0); 

     colorTransferFunction->AddRGBPoint(90, 01, 0, 04); 

  

     vtkVolumeProperty volumeProperty = vtkVolumeProperty::New(); 

     volumeProperty->SetColor(colorTransferFunction); 

     volumeProperty->SetScalarOpacity(opacityTransferFunction); 

     volumeProperty->ShadeOff(); 

     volumeProperty->SetInterpolationTypeToLinear();     

  

     vtkVolumeTextureMapper2D volumeMapper = vtkVolumeTextureMapper2D::New();     

  

     volumeMapper->SetInput(image); 

  

     vtkVolume volume = vtkVolume::New(); 

     volume->SetMapper(volumeMapper); 

     volume->SetProperty(volumeProperty); 

  

     ren1->AddVolume(volume); 

      

     ////////////////////////////////////////////////////////////////////////// 

  

     vtkTransform transform = vtkTransform::New(); 

     transform->RotateX(0); 

     transform->RotateY(-90); 

     transform->RotateZ(0);     

  

     vtkImageReslice imageReslice = vtkImageReslice::New(); 

     imageReslice->SetInput( image ); 

     // imageDataFirstRotationVolumeReslice->SetResliceAxes( sagittal_transform); 

     imageReslice->SetResliceTransform(transform); 

     imageReslice->WrapOff(); 

     imageReslice->MirrorOff(); 

     imageReslice->SetInterpolationModeToLinear(); 

     imageReslice->InterpolateOn(); 

     imageReslice->OptimizationOn(); 

     imageReslice->ReleaseDataFlagOn(); 

     imageReslice->SetBackgroundColor(0, 0, 0, 1); 

     imageReslice->SetOutputOriginToDefault(); 

     imageReslice->SetOutputSpacing(xStep, yStep, zStep); 

     imageReslice->SetOutputOrigin(5, 5, 5); 

     imageReslice->SetOutputExtent(0, xDim - 1, 0, yDim - 1, 0, zDim - 1); 

     imageReslice->Update(); 

  

     vtkImageViewer imageView = vtkImageViewer::New(); 

     imageView->SetInput(imageReslice->GetOutput()); 

     imageView->SetZSlice(5); 

     imageView->SetColorWindow(2000); 

     imageView->SetColorLevel(1000); 

      

     ren1->AddActor2D((vtkProp )imageView->GetActor2D()); 

  

     ////////////////////////////////////////////////////////////////////////// 

     ren1->SetBackground(02, 04, 06); 

     renWin->SetSize(640, 480); 

  

     // 开始渲染 

     renWin->Render(); 

  

     // 消息循环开始 

     iren->Start(); 

}

方法如下: figure; %设置坐标轴线宽,加边框,坐标字号 axes('linewidth',1, 'box', 'on', 'FontSize',16); %设置坐标轴label xlabel('时间(s)','FontSize',16); ylabel('压力(pa)','FontSize',16); grid on; hold on; plot(ScopeData1time, Sco

一般来大多数的CAD软体都可以转STL的格式,转出来表示你的图档有问题,STL常出现的问题是因为,STL的格式是以弦高切成三角形的,做为计算的,和IGES、STP不同,IGES、STP的格式有转码表的

1 定义

参考资料[1][2][3]都指出,窗技术是CT检查中用以观察不同密度的正常组织或病变的一种显示技术,包括窗宽(window width)和窗位(window level)。由于各种组织结构或病变具有不同的CT值,因此欲显示某一组织结构细节时,应选择适合观察该组织或病变的窗宽和窗位,以获得最佳显示。

11 窗宽

窗宽是CT图像上显示的CT值范围,在此CT值范围内的组织和病变均以不同的模拟灰度显示,而CT值高于此范围的组织和病变,无论高出程度有多少,均以白影显示,不再有灰度差异;反之,低于此范围的组织结构,不论低的程度有多少,均以黑影显示,也无灰度差别。

12 窗位

窗位是窗的中心位置,同样的窗宽,由于窗位不同,其所包括CT值范围的CT值也有差异。

2 实现代码

参考资料[2]中给出了相关代码,这里略去。

3 VTK中的实现

31 vtkImagePlaneWidget

在VTK中,可以直接设置窗位的类是vtkImagePlaneWidget,但这主要用于虚拟切片中。对于普通的图像,可按照32或者33的方法来实现。

32 vtkImageMapToWindowLevelColors

但是如果使用vtkImageReader读取图像,然后通过vtkImageActor来显示,则需要借助vtkImageMapToWindowLevelColors类来实现窗宽窗位的设置,详见vtkImageMapToWindowLevelColors的测试案例TestMapToWindowLevelColorspy。

33 vtkInteractorStyleImage

32是通过用于自己设定窗宽窗位来实现不同的观测效果的。此外,还可以通过改变Ineractor的style来达到这个目的,例如:

[cpp] view plain copy

vtkSmartPointer< vtkInteractorStyleImage > interactorStyleImage =

vtkSmartPointer< vtkInteractorStyleImage >::New();

ui->qvtkWidget->GetInteractor()->SetInteractorStyle( interactorStyleImage );

这时,使用鼠标和通过qvtkWidget显示的图像进行交互时,按住左键拖动鼠标即可实现窗位窗宽的调整。这是最适合于观测图像的交互风格。

#include "vtkDICOMImageReaderh"

#include "vtkOutlineFilterh"

#include "vtkPolyDataMapperh"

#include "vtkActorh"

#include "vtkRendererh"

#include "vtkRenderWindowh"

#include "vtkRenderWindowInteractorh"

#include "vtkImagePlaneWidgeth"

#include "vtkCellPickerh"

#include "vtkPropertyh"

#include "vtkImageMapToColorsh"

#include "vtkImageActorh"

#include "vtkCamerah"

#include "vtkCommandh"

#include "vtkJPEGReaderh"

class vtkWidgetWindowLevelCallback;

class vtkWidgetWindowLevelCallback : public vtkCommand

{

public:

static vtkWidgetWindowLevelCallback New()

{ return new vtkWidgetWindowLevelCallback; }

void Execute( vtkObject caller, unsigned long vtkNotUsed( event ),

void callData )

{

vtkImagePlaneWidget self = reinterpret_cast< vtkImagePlaneWidget >( caller );

if(!self) return;

double wl = static_cast<double>( callData );

if ( self == this->WidgetX )

{

this->WidgetY->SetWindowLevel(wl[0],wl[1]);

this->WidgetZ->SetWindowLevel(wl[0],wl[1]);

}

else if( self == this->WidgetY )

{

this->WidgetX->SetWindowLevel(wl[0],wl[1]);

this->WidgetZ->SetWindowLevel(wl[0],wl[1]);

}

else if (self == this->WidgetZ)

{

this->WidgetX->SetWindowLevel(wl[0],wl[1]);

this->WidgetY->SetWindowLevel(wl[0],wl[1]);

}

}

vtkWidgetWindowLevelCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}

vtkImagePlaneWidget WidgetX;

vtkImagePlaneWidget WidgetY;

vtkImagePlaneWidget WidgetZ;

};

void Test_02()

{

vtkDICOMImageReader DicomReader = vtkDICOMImageReader::New();

DicomReader->SetDataByteOrderToLittleEndian();

DicomReader->SetDirectoryName( "D:\\T_PETCT_Example\\CT483" );

DicomReader->Update();

vtkOutlineFilter DicomOutline = vtkOutlineFilter::New();

DicomOutline->SetInputConnection( DicomReader->GetOutputPort() );

vtkPolyDataMapper DicomMapper = vtkPolyDataMapper::New();

DicomMapper->SetInputConnection( DicomOutline->GetOutputPort() );

vtkActor DicomActor = vtkActor::New();

DicomActor->SetMapper( DicomMapper );

vtkRenderWindow renWin = vtkRenderWindow::New();

vtkRenderer ren = vtkRenderer::New();

vtkRenderer ren1 = vtkRenderer::New();

vtkRenderer ren2 = vtkRenderer::New();

vtkRenderer ren3 = vtkRenderer::New();

vtkRenderWindowInteractor iren = vtkRenderWindowInteractor::New();

renWin->AddRenderer( ren1 );

renWin->AddRenderer( ren2 );

renWin->AddRenderer( ren3 );

renWin->AddRenderer( ren );

iren->SetRenderWindow( renWin );

//ren->AddActor( DicomActor );

vtkCellPicker picker = vtkCellPicker::New();

picker->SetTolerance( 0005 );

vtkImagePlaneWidget planeWidgetX = vtkImagePlaneWidget::New();

planeWidgetX->SetInteractor( iren );

planeWidgetX->SetKeyPressActivationValue( 'x' );

planeWidgetX->SetPicker( picker );

planeWidgetX->RestrictPlaneToVolumeOn();

planeWidgetX->GetPlaneProperty()->SetColor( 00, 00, 10 );

planeWidgetX->DisplayTextOn();

//planeWidgetX->TextureInterpolateOn();

planeWidgetX->TextureInterpolateOff();

planeWidgetX->SetResliceInterpolateToLinear();

planeWidgetX->SetInputData( (vtkDataSet)DicomReader->GetOutput() );

planeWidgetX->SetPlaneOrientationToXAxes();

planeWidgetX->SetSliceIndex( 255 );

planeWidgetX->GetTexturePlaneProperty()->SetOpacity( 1 );

planeWidgetX->On();

vtkImagePlaneWidget planeWidgetY = vtkImagePlaneWidget::New();

planeWidgetY->SetInteractor( iren );

planeWidgetY->SetKeyPressActivationValue( 'y' );

planeWidgetY->SetPicker( picker );

planeWidgetY->RestrictPlaneToVolumeOn();

planeWidgetY->GetPlaneProperty()->SetColor( 10, 00, 00 );

planeWidgetY->DisplayTextOn();

planeWidgetY->TextureInterpolateOn();

planeWidgetY->SetResliceInterpolateToLinear();

planeWidgetY->SetInputData( (vtkDataSet)DicomReader->GetOutput() );

planeWidgetY->SetPlaneOrientationToYAxes();

planeWidgetY->SetSliceIndex( 255 );

planeWidgetY->On();

vtkImagePlaneWidget planeWidgetZ = vtkImagePlaneWidget::New();

planeWidgetZ->SetInteractor( iren );

planeWidgetZ->DisplayTextOn();

planeWidgetZ->RestrictPlaneToVolumeOn();

planeWidgetZ->SetKeyPressActivationValue( 'z' );

planeWidgetZ->SetPicker( picker );

planeWidgetZ->GetPlaneProperty()->SetColor( 00, 10, 00 );

planeWidgetZ->TextureInterpolateOn();

planeWidgetZ->SetResliceInterpolateToLinear();

planeWidgetZ->SetInputData( (vtkDataSet)DicomReader->GetOutput() );

planeWidgetZ->SetPlaneOrientationToZAxes();

planeWidgetZ->SetSliceIndex( 200 );

planeWidgetZ->On();

vtkWidgetWindowLevelCallback cbk = vtkWidgetWindowLevelCallback::New();

cbk->WidgetX = planeWidgetX;

cbk->WidgetY = planeWidgetY;

cbk->WidgetZ = planeWidgetZ;

cbk->Delete();

vtkImageMapToColors colorMap1 = vtkImageMapToColors::New();

colorMap1->PassAlphaToOutputOff(); //use in RGBA

colorMap1->SetActiveComponent( 0 );

colorMap1->SetOutputFormatToLuminance();

colorMap1->SetInputData( (vtkDataSet)planeWidgetX->GetResliceOutput() );

colorMap1->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable() );

vtkImageActor imageActor1 = vtkImageActor::New();

imageActor1->PickableOff();

imageActor1->SetInputData( colorMap1->GetOutput() );

vtkImageMapToColors colorMap2 = vtkImageMapToColors::New();

colorMap2->PassAlphaToOutputOff();

colorMap2->SetActiveComponent( 0 ); // for muti-component

colorMap2->SetOutputFormatToLuminance();

colorMap2->SetInputData( (vtkDataSet)planeWidgetY->GetResliceOutput() );

colorMap2->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable() );

vtkImageActor imageActor2 = vtkImageActor::New();

imageActor2->PickableOff();

imageActor2->SetInputData( colorMap2->GetOutput() );

vtkImageMapToColors colorMap3 = vtkImageMapToColors::New();

colorMap3->PassAlphaToOutputOff();

colorMap3->SetActiveComponent( 0 );

colorMap3->SetOutputFormatToLuminance();

colorMap3->SetInputData( (vtkDataSet)planeWidgetZ->GetResliceOutput() );

colorMap3->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable());

vtkImageActor imageActor3 = vtkImageActor::New();

imageActor3->PickableOff();

imageActor3->SetInputData( colorMap3->GetOutput() );

ren->AddActor( DicomActor ); //outline

ren1->AddActor( imageActor1 );

ren2->AddActor( imageActor2 );

ren3->AddActor( imageActor3 );

// OK

ren->SetBackground( 03, 03, 06 );

ren1->SetBackground( 10, 00, 00 );

ren2->SetBackground( 00, 10, 00 );

ren3->SetBackground( 00, 00, 10 );

renWin->SetSize( 1000, 1000 );

ren->SetViewport( 0, 05, 05, 1 );

ren1->SetViewport( 05, 05, 1, 1 );

ren2->SetViewport( 0, 0, 05, 05 );

ren3->SetViewport( 05, 0, 1, 05 );

iren->Initialize();

iren->Start();

renWin->Render();

}

int main()

{

Test_02();

return 0;

}

以上就是关于vtkpolydata的单元Id和法向量如何获取全部的内容,包括:vtkpolydata的单元Id和法向量如何获取、在VTK中怎么取Volume的切片、vtkAxesActor设置坐标系怎么改变坐标轴上X,Y和Z的颜色等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9580797.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存