Ordenando um conjunto de pontos não organizados ao longo de uma curva

9

Eu tenho um conjunto de pontos 3D (que eu recupero de uma biblioteca que executa o mosaico de um corpo sólido) que pertencem a uma curva (isto é, uma borda do sólido). Isso significa que a curva certamente passa por cada um desses pontos.

No entanto, o conjunto de pontos não é ordenado, portanto, preciso classificá-los para poder desenhar essa curva corretamente.

Existe alguma abordagem conhecida para esse tipo de problema?

Algumas informações adicionais:

  • As curvas são paramétricas em geral (splines / bezier, fatias circulares ..).
  • Os pontos são dados como coordenadas de ponto flutuante.
  • Os pontos são muito densos (mas podem ser tão densos quanto eu quero). Para se ter uma idéia, para uma curva que ocupa 19 unidades em x, 10 unidades em x e 5 unidades em z, cito uma sequência de pontos em um segmento de curva: (20.7622, ​​25.8676, 0) (20.6573, 25.856, 0) (20.5529, 25.8444, 0) (20.4489, 25.8329, 0) (20.3454, 25.8213, 0)
andrea.al
fonte
Mesmo se soubermos a ordem, há até um número infinito de curvas que se encaixam nos pontos. Mesmo se adicionarmos restrições adicionais, as extremidades abertas são problemáticas, pois sua orientação tangente pode ser arbitrária. Uma foto aqui
joojaa
@joojaa Sim, você está certo. Mas como o empacotamento de pontos é muito denso, não espero que seja exato. Se eu conseguir a ordem certa, planejava conectar a sequência de pontos como uma polilinha.
22616 Andrea.al 23/02/16
No código que precisa ordenar os pontos, você está ciente da forma paramétrica da curva? (Se não, eu vou apagar minha primeira resposta, porque ele requer que você sabe a forma paramétrica.)
Martin Ender
@ MartinBüttner Sim, eu tenho acesso à forma paramétrica da curva, se necessário.
22616 Andrea.al 23/02/16
11
Por favor, mostre um conjunto de pontos típico!
Yves Daoust

Respostas:

6

Você tem uma instância de um problema chamado reconstrução de curvas a partir de pontos desorganizados . Agora que você sabe o que procurar, encontrará vários métodos, como a crosta, NN-crust, etc. Aqui estão alguns links:

Como você está lidando com curvas e as amostras são densas, sugiro que você calcule uma árvore de abrangência mínima euclidiana.

lhf
fonte
4

Após alguns esclarecimentos, provavelmente existe uma abordagem muito melhor que nem exige o conhecimento da forma paramétrica da curva e também evita a etapa de minimização numérica potencialmente problemática.

Se a curva não se cruzar e os pontos estiverem suficientemente densos na curva (e com isso quero dizer, eles devem estar mais próximos do que quaisquer dois pontos na curva que não pertençam ao mesmo segmento, por exemplo, pelo empacotamento da curva) em si mesmo), é possível determinar facilmente o ponto anterior e o próximo de cada amostra:

  • O(nlogn)
  • Você precisará fazer algum tratamento especial para os pontos de extremidade. Os dois vizinhos mais próximos serão os próximos dois pontos ao longo da curva, em vez de um de cada lado. Você pode detectá-las heuristicamente se a proporção das distâncias para os dois vizinhos diferir em mais do que algum limite (1,5 digamos, depende da suavidade da sua curva e da densidade dos pontos). Ou você pode tratar os dados do vizinho mais próximo como um gráfico, no qual verá que os dois vizinhos dos pontos de extremidade apontam um para o outro (o que não deve acontecer em nenhum outro lugar do gráfico).
  • Agora você pode simplesmente escolher um ponto final e caminhar pelos vizinhos mais próximos (sempre escolhendo o de onde você não chegou) para percorrer os pontos ao longo da curva.

θ

Martin Ender
fonte
3

(X,Y,Z)(x(t),y(t),z(t))

(Xx(t))2+(Yy(t))2+(Zz(t))2

t

ttt

Martin Ender
fonte