Si tengo un arco (que viene como parte de una elipse), ¿puedo representarlo (o al menos aproximarme de cerca) mediante la curva cúbica de Bézier? Y si es así, ¿cómo puedo calcular los puntos de control para esa curva de Bézier?
Respuesta
¿Demasiados anuncios?Si nadie ella está familiarizado con Postscript o de Látex, hice algunos ejemplos de trabajo para dibujar CUALQUIER forma elíptica, parabólica, hiperbólica y el arco circular sólo por el uso de una) integral (no racional) cuadrática de las curvas de Bézier con la Imagen del entorno en el Látex y b) para el lenguaje PostScript, utilizando integral cúbicos de las curvas de Bézier.
He visto muchos ejemplos repetidos en la literatura y en internet, donde hubo intentos de hacer esto con algo de la magia de matemáticas. Este debe fallar desde el principio, porque no hay manera de producir cualquier "buen" aproximación de un semicírculo con sólo una curva cúbica.
Así que empecé a pensar desde otra perspectiva. Racional de las curvas de uso de pesos, los cuales están asociados a los respectivos puntos de Bézier para dar mucho más control sobre la forma de la curva, a continuación, integral de las curvas de Bézier. Desde un punto de vista matemático que reproduce exactamente cualquier cónica forma curva (parabol, hipérbola, elipse, círculo y (degenerado) una línea).
Una ecuación cuadrática racional de las curvas de Bézier en la forma estándar (solo el punto central tiene un peso que otros, a continuación, 1) se convierte en una parte integral de las curvas de Bézier, si este centro de peso lo suficientemente cerca a 1 (el usuario puede ajustar el permitido de error).
El uso de una formulación recursiva, esta idea conduce a una muy conpact y también de manera muy precisa para reemplazar el arco circular por una serie de cualquiera de las cuadrática o cúbica las curvas de Bézier. Las matemáticas No se necesita nada más lo único que tiene para ofrecer es el error de enlazado. Si usted mira Postscript sí, usted encontrará que su intérprete hace de la misma manera, Adobe llama simplemente "planitud". Este es exactamente el mismo método que he utilizado.
Si aquí alguien está interesado en trabajar en los ejemplos (Postscript, de Látex o de código de C), me deja una nota en . Voy a publicar de nuevo el código con muchos ejemplos. En el ínterin, usted puede desear mirar en "Lapdf", un Látex estilo que me publicado en el CTAN de la red. Este estilo permite producir pura gráfico PDF desde dentro de su documento LaTeX. Tiene todas esas cosas bonitas que se implementan, lo que significa que usted puede dibujar cualquier cónica de la curva mediante el uso de sólo el PDF de las curvas, lo que significa integral cúbicos curvas. Otro de Látex estilo hecho por mí, es el de las Curvas de estilo, que sólo utiliza el Látex interno integral cuadrática de las curvas de Bézier para lograr los mismos resultados.
Si se mira el conjunto de la curva de dibujo/conversión problema desde la perspectiva de la rasterización de motor, que básicamente lleva todo esto para papel/pantalla o cualquier otro dispositivo de salida, se llega a la conclusión de que no importa el rasteriza el que las curvas se produce, sólo tiene que poduce agradable alineados los puntos que dan la impresión de una curva suave.
Desde mi punto de vista (y yo, literalmente, leer hundrets de artículos científicos sobre estos temas) muchas personas que pierden su tiempo, tratando de overmathematize toda esta zona. La mayoría de ellos ni siquiera implementar cualquier función/procedimiento para dibujar una curva perfecta de la forma, pero todo lo que alguna vez dijo o escribió, puede demostrarse matemáticamente. Esta es la gran brecha entre la teoría y la práctica.
Estoy sólo de vez en cuando por aquí a leer las cosas, así que por favor póngase en contacto conmigo si realmente hay interés en resolver este problema en la práctica. Para todos aquellos que no pueden esperar, aquí está el código C para una rutina que llama la racional cuadrática de las curvas de Bézier (lo que implica que todos los cónicos), sólo el uso integral de las curvas de Bézier cuadrática:
//-----------------------------------------------------------------------
// The error bound is T (0..4), which is used by delta, T = 0 gives
// extremely exact concics, but at the cost of more curve segments.
// The lin macro does linear interpolation between two coordinates.
// This is used by the function ratio(). The conic function works by
// recursively calling itself until the center weight w approaches 1.
// The conic() function need a function bezier() which draws integral
// quadratic Bezier curves. Each point is defined as (x, y, w).
//-----------------------------------------------------------------------
#define delta (pow(4, 4-T)*fabs(w-1))
#define lin(t,a,b) ((a) + (t)*((b) - (a)))
typedef float fpt[3];
// ----------------------------------------------
void ratio(float t, fpt p, fpt q, fpt r) {
r[0] = lin(t, p[0], q[0]);
r[1] = lin(t, p[1], q[1]);
r[2] = lin(t, p[2], q[2]);
}
// ----------------------------------------------
void conic(fpt *p, float w) {
float s;
fpt l[3], r[3];
if (w && delta > 1) {
s = w / (1 + w);
w = sqrt((1 + w) / 2);
ratio( 0, p[0], p[0], l[0]);
ratio( 0, p[2], p[2], r[2]);
ratio( s, l[0], p[1], l[1]);
ratio( s, r[2], p[1], r[1]);
ratio(.5, l[1], r[1], l[2]);
ratio( 0, l[2], l[2], r[0]);
conic(l, w);
conic(r, w);
}
else {
qbezier(p);
}
}
//-----------------------------------------------------------------------
Al final de este comentario, me gustaría mencionar que todo esto mucho más está implementado en mis versiones publicadas de EiC (Ed. Breen del ANSI C-Intérprete). Mi versión es pura lote orientado y, además, se suministra con una extensa biblioteca de gráficos, uso de Nelson de alta calidad de suavizado de líneas.
Este EiC intérprete está disponible para DOS puro (de modo VESA, lineal frame buffer), Windows (modo VESA, la conmutación del banco), Atari, Mac 68k (ministerio de obras públicas de la herramienta), Mac OS 9 (ministerio de obras públicas de la herramienta) y Mac OSX (utilizando AquaTerm). No sé nada acerca de UNIX/Linux gráficos, por lo que este uno es dejado de lado por ahora.
Gracias por tu buen sitio web de la gente y mantener la programación.
Detlef Reimers