??使用vtk來繪制等值線,需要使用到vtkContourFilter,它所處理的數(shù)據(jù)需要是規(guī)則網(wǎng)格數(shù)據(jù),如規(guī)則的正方形網(wǎng)格等。
?通過使用vtkContourFilter::SetValue(i,value)方法,i表示第幾條等值線,從0開始計(jì)算,value表示等值線的值。多邊形的每個(gè)點(diǎn)都有一個(gè)屬性值,兩個(gè)相鄰的屬性值之間要先通過插值,再把這些屬性值作為該函數(shù)的輸入。如:
???????????SetValue(0,5);
畫一條等值為5的等值線。兩個(gè)相鄰的點(diǎn)的屬性值為3和6,則先插值為(3,4,5,6),所以該先應(yīng)該經(jīng)過這條邊的2/3處。
?也可以使用vtkContourFilter::GenerateValues(count, start, end);來生成一些列的等值線,其中count參數(shù)指定等值線的條數(shù),而start指定第一條等值線的值,end指定最后一條等值線的值,中間等值線的值則通過計(jì)算得到。
成都創(chuàng)新互聯(lián)公司IDC提供業(yè)務(wù):多線服務(wù)器托管,成都服務(wù)器租用,多線服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(jī)房。
????vtkContourFilter::SetValue(…)、GenerateValues(…)、GetNumberOfContours(…)
解釋:
?SetValue和GenerateValues均為設(shè)置等值線值的函數(shù);這兩個(gè)函數(shù)的不同之處在于SetValue設(shè)置一條等值線值,而GenerateValues對應(yīng)n條等值線的值,同時(shí)數(shù)量n包括兩個(gè)邊界值,其余n-2條等值線的值自動(dòng)按照線性關(guān)系產(chǎn)生。
?SetValue和GenerateValues函數(shù)根據(jù)先后調(diào)用關(guān)系產(chǎn)生覆蓋,即后調(diào)用的函數(shù)產(chǎn)生的等值線可能覆蓋掉先調(diào)用函數(shù)產(chǎn)生的等值線,這與等值線的條數(shù)(GetNumberOfContours)相關(guān)。
?例如:首先調(diào)用GenerateValues(3, 100, 300)產(chǎn)生3條等值線,分別為100、200、300;然后調(diào)用SetValue(0, 125),則最終效果為共有3條等值線,分別為125、200、300;如果改為調(diào)用SetValue(3, 400),則最終效果為共有4條等值線,分別為100、200、300、400。
?SetValue一般用于覆蓋某一條已經(jīng)存在的等值線,或者增加一條等值線;GenerateValues一般重新設(shè)置等值線的條數(shù)。
示例代碼:
#include "vtkAutoInit.h"
VTK_MODULE_INIT( vtkRenderingOpenGL2 );
VTK_MODULE_INIT( vtkInteractionStyle );
#include "vtkSmartPointer.h"
#include "vtkContourFilter.h"
#include "vtkInteractorStyleUser.h"
#include "vtkProperty.h"
#include "vtkOutlineFilter.h"
#include "vtkCommand.h"
#include "vtkSliderWidget.h"
#include "vtkSliderRepresentation.h"
#include "vtkSliderRepresentation3D.h"
#include "vtkImageData.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkXMLImageDataWriter.h"
#include "vtkNamedColors.h"
namespace
{
void CreateData( vtkImageData* data );
class vtkSliderCallback : public vtkCommand
{
public:
static vtkSliderCallback* New()
{
return new vtkSliderCallback;
}
virtual void Execute( vtkObject *caller, unsigned long eventId, void *callData )
{
vtkSliderWidget* sliderWidget = reinterpret_cast<vtkSliderWidget*>(caller);
double value = static_cast<vtkSliderRepresentation*>(sliderWidget->GetRepresentation())->GetValue();
this->ContourFilter->GenerateValues( 5, 10.0, value );
//5: 5contour line
//10.0 * value: start value
//value: end value
}
vtkSliderCallback() : ContourFilter( NULL ){}
vtkContourFilter* ContourFilter;
};
}
int main()
{
vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
vtkSmartPointer<vtkImageData> imgData = vtkSmartPointer<vtkImageData>::New();
CreateData( imgData );
//Create an iso surface
vtkSmartPointer<vtkContourFilter> contourFilter = vtkSmartPointer<vtkContourFilter>::New();
contourFilter->SetInputData( imgData );
contourFilter->GenerateValues( 5, 10, 10 );
//Map the contours to graphical primitives
vtkSmartPointer<vtkPolyDataMapper> contourMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
contourMapper->SetInputConnection( contourFilter->GetOutputPort() );
//Create an actor for the contours
vtkSmartPointer<vtkActor> contourActor = vtkSmartPointer<vtkActor>::New();
contourActor->SetMapper( contourMapper );
contourActor->GetProperty()->SetLineWidth( 5 );
//Create the outline
vtkSmartPointer<vtkOutlineFilter> outlineFilter = vtkSmartPointer<vtkOutlineFilter>::New();
outlineFilter->SetInputData( imgData );
vtkSmartPointer<vtkPolyDataMapper> outlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
outlineMapper->SetInputConnection( outlineFilter->GetOutputPort() );
vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
outlineActor->SetMapper( outlineMapper );
outlineActor->GetProperty()->SetColor( colors->GetColor3d( "Gray" ).GetData() );
outlineActor->GetProperty()->SetLineWidth( 3 );
//Visualize
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer( renderer );
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow( renderWindow );
renderer->AddActor( contourActor );
renderer->AddActor( outlineActor );
renderer->SetBackground( colors->GetColor3d( "Burlywood" ).GetData() );
vtkSmartPointer<vtkSliderRepresentation3D> sliderRep = vtkSmartPointer<vtkSliderRepresentation3D>::New();
sliderRep->SetMinimumValue( 0.0 );
sliderRep->SetMaximumValue( 30.0 );
sliderRep->SetValue( 10.0 );
sliderRep->SetTitleText( "Contour value" );
sliderRep->SetPoint1InWorldCoordinates( -20, -40, 0 );
sliderRep->SetPoint2InWorldCoordinates( 0, -40, 0 );
sliderRep->SetSliderWidth( 0.2 );
sliderRep->SetLabelHeight( 0.1 );
vtkSmartPointer<vtkSliderWidget> sliderWidget = vtkSmartPointer<vtkSliderWidget>::New();
sliderWidget->SetInteractor( interactor );
sliderWidget->SetRepresentation( sliderRep );
sliderWidget->SetAnimationModeToAnimate();
sliderWidget->EnabledOn();
vtkSmartPointer<vtkSliderCallback> callback = vtkSmartPointer<vtkSliderCallback>::New();
callback->ContourFilter = contourFilter;
sliderWidget->AddObserver( vtkCommand::InteractionEvent, callback );
vtkSmartPointer<vtkInteractorStyleUser> interactStyle = vtkSmartPointer<vtkInteractorStyleUser>::New();
interactor->SetInteractorStyle( interactStyle );
renderWindow->SetSize( 500, 500 );
renderWindow->Render();
interactor->Start();
return EXIT_SUCCESS;
}
namespace
{
void CreateData( vtkImageData* pData )
{
pData->SetExtent( -25, 25, -25, 25, 0, 0 );
pData->AllocateScalars( VTK_DOUBLE, 1 );
int* extent = pData->GetExtent();
for( int y = extent[ 2 ]; y <= extent[ 3 ]; y++ )
{
for( int x = extent[ 0 ]; x <= extent[ 1 ]; x++ )
{
double* pixel = static_cast<double*>(pData->GetScalarPointer( x, y, 0 ));
pixel[ 0 ] = sqrt( pow( x, 2.0 ) + pow( y, 2.0 ) );
}
}
vtkSmartPointer<vtkXMLImageDataWriter> writer =
vtkSmartPointer<vtkXMLImageDataWriter>::New();
writer->SetFileName( "data.vti" );
writer->SetInputData( pData );
writer->Write();
writer->Update();
}
}
結(jié)果如下圖所示:
分享名稱:VTK繪制等值線
本文地址:http://sd-ha.com/article32/jsjspc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、小程序開發(fā)、企業(yè)建站、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)