2012-02-28 19 views
9

Al mirar Convert a quadratic bezier to a cubic?, finalmente puedo entender por qué los profesores de programación siempre me dijeron que las matemáticas eran tan importantes. Tristemente, no escuché.Convertir curva cuadrática a curva cúbica

¿Alguien puede proporcionar una fórmula más concreta, por ejemplo, lenguaje de computadora, y para convertir una curva cuadrática en un cubo? Entender que hay algunos errores de redondeo posibles, lo cual está bien.

Dada una curva quad representado por las variables:

StartX, StartY 
ControlX, ControlY 
EndX, EndY 

Y deseando StartX, StartY y EndX, EndY a seguir siendo el mismo, pero ahora tiene Control1X, Control1Y y Control2X, Control2Y de una curva cúbica.

Es ...

Control1X = StartX + (.66 * (ControlX - StartX)) 
Control2X = EndX + (.66 * (ControlX - EndX)) 

Con las mismas funciones esenciales que se utilizan para calcular Control1Y y Control2Y?

+0

Vea también http://stackoverflow.com/questions/3162645/convert-a-quadratic-bezier-to-acubic. – lhf

Respuesta

7

Su código es correcto, excepto que debe usar 2.0/3.0 en lugar de 0.66.

0

a evitar errores más redondeo mediante el uso de

Control1 = (Start + 2 * Control)/3 
Control2 = (End + 2 * Control)/3 

en cuenta que los segmentos de línea también son convertibles a las curvas de Bezier cúbicos usando:

Control1 = Start 
Control2 = End 

Esto puede ser útil al convertir una mezcla de diferentes tipos de ruta compleja de curvas (lineal, cuadrática, cúbica)

También hay una transformación básica para convertir arcos elípticos a cúbicos (con algunos pequeños errores imperceptibles) s): solo tiene que dividir al menos el arco en cuadrantes elípticos (cortando la elipse primero en los dos ejes ortogonales de las simetrías, o en el eje ortogonal arbitrario que pasa por el centro si la elipse es un círculo, y luego representa cada arco; cuando la elipse es una cricle, los dos puntos focales se confunden en el mismo punto, el centro del círculo).

Muchos renderizadores SVG lo hacen agregando una división adicional en octantes (para que también obtenga una posición precisa no solo para los puntos por donde pasan los dos ejes principales, sino también para dos ejes diagonales que se bisecan (cuando la elipse es un círculo) cada cuadrante (cuando la elipse no es un círculo, se asimila como un círculo aplanado con una transformación lineal solo a lo largo del eje pequeño, se realiza el mismo cálculo), porque los oradores también se posicionan con bastante precisión (cos (pi/4) = sin (pi/4) = sqrt (2)/2 ~ 0.71, y porque esta división adicional permitirá la representación precisa de tangentes en los puntos que cruzan las diagonales a 45 grados del círculo): una elipse completa se convierte a 8 arcos cúbicos (es decir, 8 puntos en la elipse y 16 puntos de control): casi no notarás la diferencia entre estos arcos elípticos y arcos cúbicos (puedes crear un algoritmo que use t El mismo "error de aplanamiento" calculado al dividir un Bezier en una lista de segmentos lineales, que luego se dibujan utilizando el algoritmo Bresenham clásico para segmentos de línea.


Tal transformar de caminos arbitrarios es útil cuando se desea derivar otras curvas de la ruta, en particular las curvas de "buffers" a una distancia dada, sobre todo cuando estos caminos deben ser convertidos a "golpes" con una "Anchura de trazo" definida: necesita calcular dos curvas "internas" y "externas" y luego concentrarse en cómo convertir las mitras/peros/cuadrados/esquinas redondeadas, y luego cortar los mitradores largos a una distancia conveniente (que coincida con el " límite de inglete "factor multiplicado por el" ancho de trazo ").

Más procesadores avanzados también se utilizan mitras representados por círculos tangentes cuando hay una esquina entre dos arcos en lugar de dos segmentos (esto es útil para la elaboración de mapas geográficos lindo ...)

La conversión de una mezcla de segmentos de trayectoria arbitraria, arcos elípticos y más bezier a solo cúbico es un paso necesario para calcular imágenes precisas sin defectos excesivos visibles al acercarse. Esto es necesario cuando los búferes de "trazo" tienen que tomar algunos efectos (como el cálculo de guiones) y luego mejorar el resultado con píxeles semitransparentes o subpíxeles para suavizar los trazos renderizados (el suavizado es fácil de computar solo cuando todo se ha aplanado en segmentos de línea, y también puede ser más fácil de desarrollar si solo tiene que gestionar rutas que contienen solo cachorro) ic beziers: puede ser paralelizado fácilmente si es necesario y acelerado por hardware).

Cuestiones relacionadas