¿Cómo evitar la auto-intersección al aplicar un trazo a una curva?


11

Tengo varios objetos Spline2D en mi código, cada uno de los cuales tiene un método de Posición, Velocidad y Aceleración que devuelve un vector de la cantidad especificada en un momento determinado. He estado usando estos vectores para construir geometría para crear trazos de gradiente para las curvas, pero estoy teniendo problemas con las auto intersecciones en curvas pronunciadas. Como ejemplo, aquí hay una curva en la que estoy teniendo esto:

Estructura metálica: http://twitpic.com/2zplw1/full
Relleno: http://twitpic.com/2zpmnt/full

Como puede ver, en la segunda curva, la parte interna se cruza, lo que causa ese feo artefacto. ¿Existe un buen algoritmo / método para trazar curvas sin causar esa auto-intersección?

EDITAR : ejemplos más extremos, más una maqueta de lo que me gustaría lograr:

Estructura metálica: http://twitpic.com/2ztwzi/full
Relleno: http://twitpic.com/2ztwkt/full
Resultado ideal (maqueta): http://twitpic.com/2ztxa8/full


Wow, ni siquiera me había dado cuenta de la connotación del título cuando lo escribí. :)
ThatsGobbles

Respuestas:


3

Si está renderizando estos con la GPU y cualquier api 3D moderna (por ejemplo, OpenGL / D3D), me parece que puede deshacerse de esto con pruebas de profundidad. Si asigna sus verts exteriores para ser z = FAR, y sus verts interiores para ser z = NEAR, la prueba de profundidad evitará que se muestre la superposición. Con 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

Advertencia: esto no funcionará si necesita trazos translúcidos.


1
Gran respuesta, justo lo que estaba pensando, sin embargo, te equivocas al no funcionar para trazos translúcidos si permites escribir el zbuffer en una pasada, y luego hacer el color en la segunda.
Richard Fabian

Gracias, mis trazos son realmente opacos, ¡así que esto funcionó de manera muy simple y maravillosa!
ThatsGobbles

1

El "Arreglo" dependerá de cómo desee que se vea la salida resultante. El problema no se ha definido realmente bien aquí: ¿qué significa ser?

Te sugiero que primero intentes hacer un ejemplo aún más extremo de la falla, luego, usando Photoshop / Paint para arreglarlo, puedes encontrar inspiración para una solución.

¿Quieres que se pliegue? Superposición con el borde? ¿Tire hacia adentro hasta que no se superponga?


Buen punto, prepararé una curva con un giro más agudo y una curva "ideal" en Illustrator o Inkscape más tarde hoy.
ThatsGobbles

¡Publicación original editada!
ThatsGobbles
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.