参考链接
Description 这个示例使用vtkOBBTree返回一条线和数据集的所有交叉点。如果你想要最近的交点,需要手动找到它。在本例中,我们创建了一个球体,并与之相交一条直线。
代码 OBBTreeIntersectWithLine.cxx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkPointData.h> #include <vtkLine.h> #include <vtkOBBTree.h> int main (int , char *[]) { vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New (); sphereSource->Update (); vtkSmartPointer<vtkOBBTree> tree = vtkSmartPointer<vtkOBBTree>::New (); tree->SetDataSet (sphereSource->GetOutput ()); tree->BuildLocator (); double lineP0[3 ] = {0.0 , 0.0 , 0.0 }; double lineP1[3 ] = {0.0 , 0.0 , 2.0 }; vtkSmartPointer<vtkPoints> intersectPoints = vtkSmartPointer<vtkPoints>::New (); tree->IntersectWithLine (lineP0, lineP1, intersectPoints, NULL ); std::cout << "NumPoints: " << intersectPoints->GetNumberOfPoints () << std::endl; double intersection[3 ]; for (int i = 0 ; i < intersectPoints->GetNumberOfPoints (); i++ ) { intersectPoints->GetPoint (i, intersection); std::cout << "Intersection " << i << ": " << intersection[0 ] << ", " << intersection[1 ] << ", " << intersection[2 ] << std::endl; } return EXIT_SUCCESS; }
CMakeLists.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 cmake_minimum_required (VERSION 3.3 FATAL_ERROR)project (OBBTreeIntersectWithLine)find_package (VTK COMPONENTS vtkCommonCore vtkCommonDataModel vtkFiltersGeneral vtkFiltersSources QUIET) if (NOT VTK_FOUND) message ("Skipping OBBTreeIntersectWithLine: ${VTK_NOT_FOUND_MESSAGE}" ) return () endif ()message (STATUS "VTK_VERSION: ${VTK_VERSION}" )if (VTK_VERSION VERSION_LESS "8.90.0" ) include (${VTK_USE_FILE} ) add_executable (OBBTreeIntersectWithLine MACOSX_BUNDLE OBBTreeIntersectWithLine.cxx ) target_link_libraries (OBBTreeIntersectWithLine PRIVATE ${VTK_LIBRARIES} ) else () add_executable (OBBTreeIntersectWithLine MACOSX_BUNDLE OBBTreeIntersectWithLine.cxx ) target_link_libraries (OBBTreeIntersectWithLine PRIVATE ${VTK_LIBRARIES} ) vtk_module_autoinit( TARGETS OBBTreeIntersectWithLine MODULES ${VTK_LIBRARIES} ) endif ()