2009-01-03 22 views
11

Por trazo de la curva de bezier cúbico quiero decir representar una curva 'A' con un ancho de línea específico 'w'.Esquema de la curva de bezier cúbica trazo

¿Cómo puedo obtener otras curvas de bezier cúbicas que describan el contorno del trazo de bezier 'A'?

+0

el enlace actual al papel Hain si alguien está buscando para ello es: http://www.cis.usouthal.edu/~hain/ general/Publications/Bezier/BezierFlattening.pdf – Fattie

Respuesta

13

Ohhh. Desea obtener las curvas de compensación de una curva bezier.

Malas noticias. esto es difícil porque estas curvas no se pueden derivar simplemente numéricas. Contienen todo tipo de intersecciones, bucles y otras cosas desagradables.

Aunque hay algunas aproximaciones. El mejor enfoque que he leído hasta ahora es de un documento de Thomas F. Hain (Fast, Precise Flattening of Cubic Bézier Path and Offset Curves).

Hace el aplanamiento, por lo que su papel se trata principalmente de descomponer las curvas de desplazamiento en segmentos de línea y segmentos de arco circulares, pero puede combinarlos de nuevo a beziers más tarde.

Para una mejor comprensión es posible que desee leer sus otros documentos relacionados bezier también.

+0

El documento también está en citeseerx: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.106.5344&rep=rep1&type=pdf – ergosys

4

QPainterPathStroker de Qt (es de código abierto y código bastante legible) utiliza el algoritmo descrito en el documento antes mencionado para hacer lo que desee.

0

Hacer es exactamente como otros lo han explicado muy difícil. La curva de compensación no es un Bezier cúbico y es muy difícil de resolver. Entonces las concavidades que son más profundas que el desplazamiento causan problemas de intersección.

La buena noticia es que normalmente desea calcular un desplazamiento de trazo para la representación, por lo que solo necesita precisión de píxeles. Además, las diversas intersecciones aún crean un polígono relleno, si observa la regla de devanado para el llenado de polígono. Entonces, aplana la curva primero, luego se compensa de forma lineal y se convierte en un problema de polígono en línea recta.

Algunos código aquí se puede utilizar como una implementación de referencia: https://github.com/memononen/nanosvg

Cuestiones relacionadas