Árbol VTK-vtkOBBT

Prólogo: este artículo presenta principalmente las funciones, los principios de implementación y las aplicaciones relacionadas de vtkOBBTree en VTK, con la esperanza de ayudarlo también.

vtkOBBÁrbol

describir:

vtkOBBTree es un objeto que se utiliza para generar un árbol de cuadro delimitador orientado. Un cuadro delimitador orientado es un cuadro delimitador que no está necesariamente alineado a lo largo de un eje de coordenadas. Un árbol OBB es una estructura de árbol jerárquico de tales cajas, donde los niveles más profundos de OBB limitan regiones espaciales más pequeñas.

Para construir un OBB, se utiliza un proceso recursivo de arriba hacia abajo. Primero, la raíz OBB se construye encontrando la media y la matriz de covarianza de las celdas (y sus puntos) que definen el conjunto de datos. Extrae los vectores propios de la matriz de covarianza, dado un conjunto de tres vectores ortogonales, definiendo el OBB de ajuste más cercano. Para crear dos OBB secundarios, es necesario encontrar un plano de división que divida la celda numérica (aproximadamente) por la mitad. Estos luego se asignan a los OBB de los niños. Luego, el proceso continúa hasta que MaxLevel ivar limita la recursividad o no se encuentra ningún plano de división.

La siguiente figura es un ejemplo para ilustrar la segmentación de cuadros delimitadores en diferentes niveles.

 Nivel=0, el número de cuadros delimitadores es 1;

 Nivel=1, el número de cuadros delimitadores es 2;

 Nivel=2, el número de cuadros delimitadores es 4;

 Nivel=3, el número de cuadros delimitadores es 8;

 Nivel=4, el número de cuadros delimitadores es 16;

Código sobre la visualización de OBBTree

auto obbTree = vtkSmartPointer<vtkOBBTree>::New();
obbTree->SetDataSet(m_selectObject->GetPolyData());
obbTree->SetMaxLevel(5);
obbTree->BuildLocator();

double corner[3] = { 0.0, 0.0 ,0.0 };
double max[3] = { 0.0, 0.0 ,0.0 };
double mid[3] = { 0.0, 0.0, 0.0 };
double min[3] = { 0.0, 0.0, 0.0 };
double size[3] = { 0.0, 0.0, 0.0 };

obbTree->ComputeOBB(m_selectObject->GetPolyData(), corner, max, mid, min, size);

auto polydata = vtkSmartPointer<vtkPolyData>::New();
obbTree->GenerateRepresentation(0, polydata);
emit sendStructureHolesResult(polydata);

auto polydata1 = vtkSmartPointer<vtkPolyData>::New();
obbTree->GenerateRepresentation(1, polydata1);
emit sendStructureHolesResult(polydata1);

 solicitud

Ejemplo 1: Calcule el punto de intersección y la celda de intersección de la línea y el objeto PolyData.

  vtkSmartPointer<vtkOBBTree> tree =
    vtkSmartPointer<vtkOBBTree>::New();
  tree->SetDataSet(sphereSource->GetOutput());
  tree->BuildLocator();

  // Intersect the locator with the line
  double lineP0[3] = {-0.6, -0.6, -0.6};
  double lineP1[3] = {.6, .6, .6};
  vtkSmartPointer<vtkPoints> intersectPoints =
    vtkSmartPointer<vtkPoints>::New();

  vtkSmartPointer<vtkIdList> intersectCells =
    vtkSmartPointer<vtkIdList>::New();

  double tol = 1.e-8;
  tree->SetTolerance(tol);
  tree->IntersectWithLine(lineP0, lineP1,
                          intersectPoints,
                          intersectCells);

Supongo que te gusta

Origin blog.csdn.net/qq_40041064/article/details/129729586
Recomendado
Clasificación