2010-11-10 16 views
18

Estoy tratando de crear una curva de bezier "parrallel". En mis intentos me he acercado, pero no cigarro. Estoy tratando de mantener un sólido desplazamiento de 1px entre las 2 curvas (rojo, azul).¿Cómo compensar una curva de bezier cúbica?

current attempt

Mi objetivo principal es utilizar un algoritmo de absorber hasta su borde para ampliar/reducir un camino SVG.


Solución

Para cualquier otra persona que esté buscando una solución, he crear una versión AS3.

http://seant23.wordpress.com/2010/11/12/offset-bezier-curves/

+0

conjetura pura, nunca lo he hecho yo mismo, pero ¿podría simplemente copiar la curva después de que se haya mostrado como algún tipo de "imagen", y simplemente volver a dibujarla con un nuevo color en el desplazamiento preferido? – warren

+0

@warren No mantendría un desplazamiento de 1px –

+0

si dibuja una curva de, digamos, '0,0 a 2,2 a 0,2', luego copie la curva en una imagen y vuelva a dibujar centrada en' 4,4 '(en lugar de' 2,2'), ¿no daría esto un desplazamiento de 1px? – warren

Respuesta

9

de Wikipedia: (http://en.wikipedia.org/wiki/B%C3%A9zier_curve)

la curva en un desplazamiento fijo a partir de una curva de Bézier dado, a menudo llamado una curva de desplazamiento (acostado "paralelo" a la curva original, como el desplazamiento entre rieles en una vía férrea), no puede ser formado exactamente por una curva Bézier (excepto en algunos casos triviales). Sin embargo, hay métodos heurísticos que generalmente dan una aproximación adecuada para propósitos prácticos.

También puede ver el papel que se indica aquí: Outline of cubic bezier curve stroke

6

No es posible, en general, para representar el desplazamiento de una curva de Bezier como una curva de Bezier (en concreto, esto es problemático cuando se tiene cúspides o radio de curvatura cerca de la distancia de desplazamiento). Sin embargo, puede aproximar el desplazamiento a cualquier nivel de precisión.

Prueba esto:

  • compensar el Beziers en cuestión (lo que ya tiene parece bastante decente)
  • medir la diferencia entre cada curva original y las curvas de compensación correspondiente. Probaría algo así como 10 muestras y vería si funciona bien.
  • Para cualquier desplazamiento que esté fuera de tolerancia, subdivida (utilizando el algoritmo deCastlejau para Beziers) e itere.

No he implementado un desplazamiento (porque los núcleos que uso ya tienen uno), pero esto parece algo que probar.

3

espero que encontró su papel matemáticas útiles enter image description here

cuadrática de Bézier compensando con la subdivisión selectiva http://microbians.com/?page=math

+0

¿También tiene una curva cúbica, o generalización de orden superior, o su solución solo funciona para curvas cuadráticas? (En caso afirmativo, ¿está disponible ese comentario? =) –

+0

Lo siento, no lo tengo para el cálculo cúbico ... pero me doy cuenta de que puede usar una aproximación cuadrática de un cubo y luego compensar cada una, ya que las tangentes no cambiarán en los extremos de cada desplazamiento. – microbians

4

lo que pide que se llama un parallel or offset curve en matemáticas. El artículo de Wikipedia (citado anteriormente por otros) sobre las curvas de Bezier no se pudo vincular al artículo correcto para "curva de compensación", pero lo he solucionado hace unos segundos. En el mundo de los gráficos vectoriales, esa misma noción se llama acariciando la ruta.

En general, para la curva cúbica/Bezier, la curva de desplazamiento es un polinomio de orden décimo.Fuente: Kilgard, p. 28

Si todo lo que quiere hacer es rasterizar tales curvas de desplazamiento, en lugar de calcular su forma analítica, puede, por ejemplo, ver las fuentes de ghostscript. También puede consultar this patent application para ver cómo lo hace NV_path_rendering.

Si desea encubrir/aproximar las curvas de desplazamiento, entonces el documento TUG en MetaFog para cubrir METAFONT a las fuentes PostScript es una buena lectura. El sistema METAFONT, anterior a PostScript, permitía describir las fuentes mediante la operación (más matemáticamente compleja) de stroking, pero las fuentes PostScript Tipo 1 solo permiten el relleno para ser utilizado (a diferencia de los dibujos PostScript en general) por razones de velocidad.

Otro algoritmo para aproximar los desplazamientos como (solo dos) Béziers (uno a cada lado), con el código en PostScript, se da en la sección 7 de this paper by Gernot Hoffmann. (Sombrero de punta a alguien en el foro de OpenGL para encontrarlo.)

De hecho, hay muchos de esos algoritmos. Encontré un 1997 survey de varios algoritmos para aproximar las curvas de desplazamiento. Suponen que las curvas progenitoras son Beziers o NURBS.

Cuestiones relacionadas