vtkMultithreader is a class that provides support for multithreaded execution using sproc() on an SGI, or pthread_create on any platform supporting POSIX threads. This class can be used to execute a single method on multiple threads, or to specify a method per thread.
- Examples:
- vtkMultiThreader (Examples)
- Tests:
- vtkMultiThreader (Tests)
1 #ifndef INITIAL_OPENGL 2 #define INITIAL_OPENGL 3 #include <vtkAutoInit.h> 4 VTK_MODULE_INIT(vtkRenderingOpenGL) 5 VTK_MODULE_INIT(vtkInteractionStyle) 6 #endif 7 #include <iostream> 8 using namespace std; 9 #include "vtkSmartPointer.h" 10 11 #include "vtkDEMReader.h" 12 #include "vtkPolyData.h" 13 #include "vtkPolyDataMapper.h" 14 #include "vtkActor.h" 15 #include "vtkRenderer.h" 16 #include "vtkRenderWindow.h" 17 #include "vtkRenderWindowInteractor.h" 18 #include "vtkProperty.h" 19 #include "vtkCamera.h" 20 #include "vtkImageDataGeometryFilter.h" 21 #include "vtkWarpScalar.h" 22 #include "vtkPolyDataNormals.h" 23 #include "vtkLODActor.h" 24 #include "vtkImageData.h" 25 #include "vtkLookupTable.h" 26 #include "vtkPoints.h" 27 #include "vtkCellArray.h" 28 #include "vtkPolyDataCollection.h" 29 #include "vtkTriangleFilter.h" 30 #include "vtkImageResample.h" 31 #include "vtkHandleWidget.h" 32 #include "vtkSphereHandleRepresentation.h" 33 #include "vtkTestUtilities.h" 34 #include "vtkTesting.h" 35 #include "vtkAbstractWidget.h" 36 #include "vtkDataSetWriter.h" 37 #include "vtkMultiThreader.h" 38 #include "vtkWarpScalar.h" 39 40 int main(int argc, char*argv[]) 41 { 42 43 //读入海拔高度图.SainteHelens.dem 44 char* fname = "D:/Qt/VTK6.3.0/vtkExampleModelFiles/SainteHelens.dem"; 45 vtkMultiThreader::SetGlobalMaximumNumberOfThreads(2); 46 47 // Read height field. 48 // 49 vtkSmartPointer<vtkDEMReader> demReader = vtkSmartPointer<vtkDEMReader>::New(); 50 demReader->SetFileName(fname); 51 delete [] fname; 52 53 vtkSmartPointer<vtkImageResample> resample = vtkSmartPointer<vtkImageResample>::New(); 54 resample->SetInputConnection(demReader->GetOutputPort()); 55 resample->SetDimensionality(2); 56 resample->SetAxisMagnificationFactor(0,1); 57 resample->SetAxisMagnificationFactor(1,1); 58 59 // Extract geometry 60 vtkSmartPointer<vtkImageDataGeometryFilter> surface = vtkSmartPointer<vtkImageDataGeometryFilter>::New(); 61 surface->SetInputConnection(resample->GetOutputPort()); 62 63 // The Dijkistra interpolator will not accept cells that aren't triangles 64 vtkSmartPointer<vtkTriangleFilter> triangleFilter = vtkSmartPointer<vtkTriangleFilter>::New(); 65 triangleFilter->SetInputConnection( surface->GetOutputPort() ); 66 triangleFilter->Update(); 67 68 vtkSmartPointer<vtkWarpScalar> warp = vtkSmartPointer<vtkWarpScalar>::New(); 69 warp->SetInputConnection(triangleFilter->GetOutputPort()); 70 warp->SetScaleFactor(1); 71 warp->UseNormalOn(); 72 warp->SetNormal(0, 0, 1); 73 warp->Update(); 74 75 // cout << warp->GetOutput()->GetNumberOfCells() << endl; 76 77 // vtkSmartPointer<vtkDataSetWriter> writer = vtkSmartPointer<vtkDataSetWriter>::New(); 78 // writer->SetInputConnection(resample->GetOutputPort()); 79 // writer->SetFileName("foo.vtk"); 80 // writer->Write(); 81 82 // Define a LUT mapping for the height field 83 84 double lo = demReader->GetOutput()->GetScalarRange()[0]; 85 double hi = demReader->GetOutput()->GetScalarRange()[1]; 86 87 vtkSmartPointer<vtkLookupTable> lut = vtkSmartPointer<vtkLookupTable>::New(); 88 lut->SetHueRange(0.6, 0); 89 lut->SetSaturationRange(1.0, 0); 90 lut->SetValueRange(0.5, 1.0); 91 92 vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New(); 93 94 vtkSmartPointer<vtkPolyDataMapper> demMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 95 demMapper->SetInputConnection(warp->GetOutputPort()); 96 demMapper->SetScalarRange(lo, hi); 97 demMapper->SetLookupTable(lut); 98 99 vtkSmartPointer<vtkActor> demActor = vtkSmartPointer<vtkActor>::New(); 100 demActor->SetMapper(demMapper); 101 102 // Create the RenderWindow, Renderer and the DEM + path actors. 103 vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New(); 104 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); 105 renWin->AddRenderer(ren1); 106 vtkSmartPointer<vtkRenderWindowInteractor> iren = 107 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 108 iren->SetRenderWindow(renWin); 109 110 // Add the actors to the renderer, set the background and size 111 ren1->AddActor(demActor); 112 ren1->GetActiveCamera()->SetViewUp(0, 0, 1); 113 ren1->GetActiveCamera()->SetPosition(-99900, -21354, 131801); 114 ren1->GetActiveCamera()->SetFocalPoint(41461, 41461, 2815); 115 ren1->ResetCamera(); 116 ren1->ResetCameraClippingRange(); 117 118 // Here comes the surface constrained handle widget stuff..... 119 vtkSmartPointer<vtkHandleWidget> widget = vtkSmartPointer<vtkHandleWidget>::New(); 120 widget->SetInteractor(iren); 121 vtkSmartPointer<vtkSphereHandleRepresentation> rep = vtkSmartPointer<vtkSphereHandleRepresentation>::New(); 122 widget->SetRepresentation( rep ); 123 124 // Let the surface constrained point-placer be the sole constraint dictating 125 // the placement of handles. Lets not over-constrain it allowing axis 126 // constrained interactions. 127 widget->EnableAxisConstraintOff(); 128 129 // Set some defaults on the handle widget 130 double d[3] = {562532, 5.11396e+06, 2618.62}; 131 rep->SetWorldPosition( d ); 132 rep->GetProperty()->SetColor( 1.0, 0.0, 0.0 ); 133 rep->GetProperty()->SetLineWidth(1.0); 134 rep->GetSelectedProperty()->SetColor( 0.2, 0.0, 1.0 ); 135 renWin->Render(); 136 iren->Initialize(); 137 widget->EnabledOn(); 138 renWin->Render(); 139 ren1->ResetCamera(); 140 ren1->ResetCameraClippingRange(); 141 return vtkTesting::InteractorEventLoop(argc, argv, iren); 144 return 0; 145 }