Compreensão simples da árvore BSP e explicação detalhada das ideias de índice espacial da árvore binária

árvore BSP

Árvore de particionamento de espaço binário (Árvore BSP) também é chamada de árvore de particionamento de espaço binário, conhecida como árvore BSP

img

img

Algoritmo para gerar uma árvore BSP a partir de uma lista de polígonos

  • Selecione um polígono P da lista.
  • Crie um nó N na árvore BSP e adicione P à lista de polígonos do nó.
  • Para outros polígonos na lista:
    • Se o polígono estiver completamente à frente do plano que contém P, mova o polígono para a lista de nós na frente de P.
    • Se o polígono estiver completamente atrás do plano que contém P, mova o polígono para a lista de nós atrás de P.
    • Se o polígono interceptar o plano que contém P, divida-o em dois polígonos e mova-os para a lista de polígonos correspondentes atrás e na frente de P.
    • Se o polígono estiver no plano que contém P, adicione-o à lista de polígonos no nó N.
  • Aplique este algoritmo à lista de polígonos na frente de P.
  • Aplique este algoritmo à lista de polígonos seguindo P.

Desvantagens dos BSPs

  • Gerar uma árvore BSP pode ser demorado.
  • O BSP não resolve o problema da determinação da superfície visível.

O objetivo do BSP

  • É usado para detecção de colisão em videogames 3D e robótica.

  • é usado para traçado de raios

  • Envolve o processamento de cenas espaciais complexas.

    árvore kd

    Idéias de índice espacial de árvore binária

    intuição

    Dado um monte de dados de amostra existentes e um ponto de dados consultado (estrela vermelha de cinco pontas), como encontramos os 15 pontos mais próximos da estrela de cinco pontas?
    1.png

    Ignorando a implementação programática por um momento, pense em como um ser humano atua subjetivamente. Bem, ele definitivamente calculará a distância de cada um dos pontos próximos ao pentágono e, a seguir, selecionará os 15 mais próximos. Isso pode exigir apenas vinte ou trinta cálculos de distância em vez de 300.
    2.png

    Conforme mostrado na figura, apenas os pontos no círculo roxo são calculados.

    aha! Aí vem o problema. O "próximo" que mencionamos já inclui o conceito de distância. Como saber qual ponto está "próximo" da estrela de cinco pontas sem fazer cálculos? Por que reconhecemos "próximo" imediatamente e os computadores não? Isso ocorre porque quando olhamos para esta imagem, a entrada que obtemos é uma imagem com o conceito de distância, mas o computador obtém dados de coordenadas sem o conceito de distância ao calcular. Se você deseja que alguém selecione artificialmente as 15 coordenadas mais próximas de 300 conjuntos de coordenadas sem fornecer uma imagem, ele não pode economizar esforço, deve calcular todas as 300 coordenadas uma vez.

    Desta forma, o que temos a fazer é processar os dados das coordenadas secas, dividir o espaço em pequenos pedaços e armazenar as informações de maneira razoável, para que possamos ler facilmente os pontos "próximos".

    cortar

    Este coelho perigoso, está de volta! Ele fez quatro tatuagens hoje, corações, crescentes, estrelas e lágrimas, abaixo está sua foto.
    3.jpg

    Vamos responder a uma pergunta simples: Qual é a tatuagem mais próxima de um coração nesta foto? Lembre-se que no artigo anterior , a característica que escolhemos foi a altura e o peso de cada coelho, desta vez é diferente. Neste problema, a característica de cada tatuagem são as coordenadas dos eixos horizontal e vertical no plano da foto.

    Para este problema, se fizermos um cálculo aproximado, precisamos calcular a distância 3 vezes (uma para a lua, lágrimas e estrelas, respectivamente). Em seguida, o que precisamos fazer é dividir todo o espaço igualmente de acordo com a esquerda e direita e para cima e para baixo, e registrar o pequeno espaço dividido na forma de uma árvore binária, para que os pontos adjacentes possam ser lidos rapidamente e o quantidade de cálculo pode ser salva.

    Ok, vamos cortar o coelho ao meio verticalmente ao meio
    4.jpg

    Em seguida, corte em quartos do meio
    5.jpg

    Divida verticalmente em oitavo
    6.jpg

    Por fim, corte novamente na horizontal. Desta vez, alguns campos estão completamente em branco, então os descartamos e obtemos 14 cópias:
    7.jpg

    Em seguida, transformamos a imagem cortada em uma árvore binária de acordo com a relação de cima, baixo, esquerda e direita.Cada nó da árvore é um grafo e seus dois ramos são subgrafos divididos igualmente por esse grafo.
    8.jpg

    Pode-se ver que esta estrutura de árvore contém muitas informações locais, porque cada um de seus nós é igualmente dividido de acordo com cima e baixo ou esquerda e direita, portanto, se a distância entre dois pontos na árvore for relativamente próxima, então seus pontos reais a distância é relativamente próxima.

    procurar

    Em seguida, precisamos encontrar a tatuagem mais próxima do coração por meio dessa árvore binária.

    Comece no topo da árvore e procure para baixo para encontrar o nó mais baixo que contém um coração. Esta operação é muito simples, porque cada divisão é ao longo de uma certa linha vertical x=a ou ao longo de uma linha horizontal y=a, então você só precisa julgar se as coordenadas do eixo x ou y do coração do amor são maiores que a ou menos que a, e você sabe que é Selecione os ramos esquerdo ou direito.
    9.jpg

    Depois de encontrar o amor, subimos pelo mesmo caminho. Subi apenas uma seção e encontrei duas tatuagens nas nádegas
    10.png

    Pode-se ver aqui que no caso de 8 divisões iguais, o coração amoroso e a lua estão na mesma área. Eles estão "próximos" de certa forma, mas não temos certeza de que sejam os mais próximos ainda, então continue subindo para encontrá-los. Continue a subir mais dois nós e não há tatuagens além do coração e da lua. Neste nó abaixo
    11.png

    Descobrimos que a distância entre o coração e a lua (linha vermelha) é menor que a distância entre o coração e a linha divisória (linha azul), ou seja, não importa o que esteja do lado direito da linha divisória, a tatuagem desse lado não pode estar mais perto do coração. Portanto, pode-se julgar que a figura mais próxima do coração amoroso é a lua.

    Dessa forma, calculamos a distância entre o coração e a lua e a distância entre o coração e a linha divisória apenas uma vez, em vez de calcular a distância entre o coração e as outras três tatuagens separadamente. E, saiba que o cálculo da distância entre o coração e a linha divisória é muito simples, ou seja, a diferença (valor absoluto) entre a coordenada x do coração e a coordenada x da linha divisória, o que economiza um lote em comparação com o cálculo da distância entre dois pontos Cálculos.

    dificuldade

    Ah, mas também é possível que essa busca pelo ponto mais próximo não tenha corrido tão bem. No cálculo acima, depois de encontrar a lua que está mais perto do coração, descobrimos que a distância entre o coração e a linha divisória é relativamente grande, então temos certeza de que a lua é realmente a mais próxima. No entanto, com uma tatuagem mais próxima do outro lado da linha divisória, a situação é um pouco mais complicada.

    Digamos que neste coelho, adicionei mais duas tatuagens, uma folha e um círculo.
    12.png

    Essas duas tatuagens são adicionadas correspondentemente à divisão da árvore binária. Queríamos encontrar a tatuagem mais próxima do coração, então continuamos a procurar para encontrar o coração primeiro.
    13.jpg

    Encontramos um pedaço de papel e anotamos a tatuagem mais próxima do coração no nódulo visitado e a distância correspondente. Agora o papel ainda está vazio.
    14.png

    Subindo uma seção, descobri que havia uma lua em outro ramo daquela seção, então corri para verificar as coordenadas da lua, calculei a distância entre o coração e a lua e a registrei no papel (gráfico = lua , distância = d1) (gráfico = lua , distância = 1).

    Volte para o nó no círculo azul e suba, e continue a subir. Descobrimos que d1.1 (linha vermelha) é maior que a distância entre o coração do amor e a linha divisória (linha azul).
    novo1.png

    Ou seja, pode haver pontos mais próximos do outro lado da linha divisória, então comece em outro galho e procure para encontrar...
    16.png

    Em outro ramo, rastreamos o círculo e calculamos a distância d2 dele até o coração, e descobrimos que d2>d1, que está mais longe que a lua, então descarte-o.

    Subindo mais uma seção, descobrimos que d1 (linha vermelha) é maior que a distância entre o coração do amor e a linha divisória (linha azul)
    novo2.png

    Pode haver uma tatuagem mais próxima do outro lado da tangente, então procuramos no outro ramo...
    18.png

    Encontrou as folhas. (Felizmente, apenas folhas são encontradas neste ramo. Se houver mais gráficos, a recursão multicamada é necessária. O processo específico será explicado nos próximos capítulos detalhados.) Para calcular a distância entre folhas e corações, obtemos d3, e descubra que d3<d1, que está mais perto que a lua, então atualize o registro no papel como (tatuagem=folha, distância=d3).

    Subindo mais uma seção, descobrimos que d3 é menor que a distância entre o coração do amor e a linha divisória, portanto, os dados do outro lado não precisam ser considerados.
    novo3.png

    Desta vez subimos ao topo da árvore e completamos a busca, a (folha, d3) registrada no papel é a tatuagem mais próxima e a distância correspondente.
    20.png

    epílogo

    No algoritmo acima, quando tivermos encontrado um ponto mais próximo que a linha divisória, não há necessidade de continuar procurando os pontos do outro lado da linha divisória, pois esses estarão apenas mais distantes. Portanto, ao dividir todo o espaço e gravá-lo em uma estrutura de árvore, precisamos apenas pesquisar algumas áreas próximas ao ponto problemático para encontrar o ponto de dados mais próximo, economizando muitos cálculos.

    Referência [ [Quantification Classroom] Idéias do algoritmo de árvore kd - JoinQuant Quantization Classroom - JoinQuant ]

Acho que você gosta

Origin blog.csdn.net/weixin_43925768/article/details/129138298
Recomendado
Clasificación