Como evitar a auto-interseção ao aplicar o traçado a uma curva?

11

Eu tenho vários objetos Spline2D no meu código, cada um deles com um método Position, Velocity e Acceleration que retorna um vetor da quantidade especificada em um determinado momento. Eu tenho usado esses vetores para construir geometria para criar traços de gradiente para as curvas, mas estou tendo problemas com auto-interseções em curvas íngremes. Como exemplo, aqui está uma curva em que estou fazendo isso ocorrer:

Wireframe: http://twitpic.com/2zplw1/full
Preenchido: http://twitpic.com/2zpmnt/full

Como você pode ver, na segunda curva, a parte interna se cruza, o que causa esse artefato feio. Existe um bom algoritmo / método para traçar curvas sem causar essa auto-interseção?

EDIT : exemplos mais extremos, além de uma maquete do que eu gostaria de alcançar:

Wireframe: http://twitpic.com/2ztwzi/full
Preenchido: http://twitpic.com/2ztwkt/full
Resultado ideal (mock-up): http://twitpic.com/2ztxa8/full

ThatsGobbles
fonte
Uau, eu nem tinha percebido a conotação do título quando o escrevi. :)
ThatsGobbles

Respostas:

3

Se você as estiver renderizando com a GPU e qualquer API 3D moderna (por exemplo, OpenGL / D3D), parece-me que você pode se livrar disso com testes de profundidade. Se você atribuir seus verts externos a z = FAR e seus verts internos a z = NEAR, o teste de profundidade deverá impedir a exibição da sobreposição. Com o OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Advertência: isso não funcionará se você precisar de traços translúcidos.

jpaver
fonte
1
Ótima resposta, exatamente o que eu estava pensando, no entanto, você está errado sobre o fato de não funcionar para traços translúcidos se você permitir escrever o zbuffer em uma passagem e depois fazer a cor na segunda.
Richard Fabian
Obrigado, meus golpes são realmente opacos, então isso funcionou de maneira muito simples e maravilhosa!
ThatsGobbles
1

O "Fix" vai depender de como você deseja que a saída resultante seja. O problema ainda não foi definido muito bem aqui: como deve ser?

Eu sugiro que você primeiro tente fazer um exemplo ainda mais extremo da falha e, em seguida, usando o photoshop / paint para corrigi-la, você poderá encontrar inspiração para uma solução.

Deseja dobrar? Sobrepor com a borda? Puxe até que não se sobreponha?

Richard Fabian
fonte
Bom ponto, prepararei uma curva mais acentuada e uma curva "ideal" no Illustrator ou no Inkscape ainda hoje.
ThatsGobbles
Postagem original editada!
ThatsGobbles