9 votos

¿Aproximación de Bézier de la espiral de Arquímedes?

Como parte de una app de iOS que estoy haciendo, quiero dibujar una aproximación decente de una espiral de Arquímedes. La biblioteca de dibujo que estoy usando (CGPath en Quartz 2D, que está basada en C) admite arcos, así como curvas de Bézier cúbicas y cuadráticas. ¿Cuál es un buen método para aproximar una espiral de Arquímedes utilizando cualquiera de estos tipos de trazos? Por ejemplo, la imagen ejemplo de Wikipedia dice que fue "dibujada como una serie de segmentos de Bézier de mínimo error." ¿Cómo se generarían tales segmentos?

Mi formación matemática me lleva hasta Cálculo III además de algunas cosas que aprendí en una clase de mecánica clásica, pero han pasado un par de años, así que estoy oxidado. Lo que tengo hasta ahora:

Para una espiral r = a + b $\theta$, utilicé la información de esta página para encontrar que la pendiente cartesiana en cualquier punto (r, $\theta$) es igual a

$$\frac{dy}{dx}=\frac{b\sin\theta\space+\space(a + b\theta)\cos\theta}{b\cos\theta\space-\space(a + b\theta)\sin\theta}$$

A partir de aquí, podría utilizar la pendiente de punto para encontrar la ecuación de una línea tangente en cualquier punto, pero ¿cómo puedo encontrar las longitudes adecuadas de las asas (es decir, las posiciones de los dos puntos intermedios) para la curva? ¿O sería mejor/más fácil/más rápido una aproximación con segmentos de arco circulares?

Si no puedo resolverlo, simplemente usaré una imagen estática en la app, ¡pero se me ocurre que ni siquiera conozco una forma de generar una imagen de alta calidad de una espiral de Arquímedes! La herramienta de Espiral en Illustrator, por ejemplo, solo hace espirales logarítmicas.

0 votos

Su biblioteca de dibujo no puede evaluar funciones trigonométricas?

0 votos

¿Quieres decir sin/cos/tan? Estoy usando C, asi que sí, puedo. ¿A donde quieres llegar?

1 votos

Entonces, ¿por qué no simplemente usar las ecuaciones paramétricas reales de la espiral de Arquímedes en lugar de intentar dibujar una aproximación de Bézier?

3voto

deaan Puntos 11

Por lo tanto, parece que la imagen de referencia de Wikipedia utiliza secciones de 45 grados de estas curvas. Puedes usar la ecuación de la espiral para darte la línea tangente al principio y al final de estas secciones de curva. Evalúa la derivada en estos dos puntos para obtener la pendiente de la línea tangente y luego desplaza tu línea apropiadamente para alcanzar el punto utilizado. La intersección de estas dos líneas debería ser tu punto de control. Una vez que hayas encontrado tu punto de control, puedes ponerlo en la función 'CGPathAddQuadCurveToPoint' para el cx, cy (creo) junto con el punto al que quieres ir (también de la ecuación de la espiral). Para referencia--mira la animación bajo 'curvas cuadráticas' aquí

Para mayor velocidad, solo tienes que encontrar un máximo de 8 líneas tangentes--simplemente desplázalas para el próximo ciclo de la espiral y reúsalas.

0 votos

Creo que tu enlace de Wikipedia funcionaría mejor si utilizas la sintaxis [texto del enlace](URL aquí).

0 votos

Entonces, si te entiendo bien, ¿utilizo la intersección de las líneas tangentes adyacentes como los puntos de control para mis curvas cuadráticas?

0 votos

Tu enlace de Wikipedia proviene del sitio móvil, y el analizador de enlaces de Stack Exchange no lo reconoce. Aquí tienes el enlace de escritorio: en.wikipedia.org/wiki/…

2voto

jdaw1 Puntos 163

El cúbico de Bézier tiene ocho parámetros, cuatro para la función de x, y cuatro para la función de y. Impone en el segmento espiral que:

  • Los puntos finales pasen por los lugares correctos (cuatro restricciones);
  • La tangente en los puntos finales tenga el ángulo correcto (dos restricciones);
  • Las curvaturas en los puntos finales sean correctas (dos restricciones).

En la práctica, como se ha comprobado, para piezas de 60°, en cualquier resolución plausible, es indistinguible de la perfección matemática.

Hay una implementación en PostScript en github.com/jdaw1/placemat/, dentro de la cual buscar /ArchimedeanSpiralPath y /ApproximatingCurve.

Esta idea se generaliza más allá de una espiral, y hay una salida de prueba para múltiples funciones (espiral de Arquímedes en la página 57), algunas de las cuales se aproximan bien, y otras no. (La línea verde es la curva matemática correcta moveto lineto … lineto; la delgada negra es la aproximación cúbica de Bézier.) Se ‘discute’ en comp.lang.postscript.

También ver PNG relevante.

Si se dibuja un círculo con un cúbico de Bézier, el error varía como la sexta potencia del ángulo (detalles en comp.lang.postscript). Sospecho, pero no me he molestado en demostrar, que lo mismo es cierto aquí. Asumiendo eso, reducir el tamaño del ángulo de 60° a 45° reduciría el error en un factor de ¾  0.178  1 / 5.6, y reducir de 60° a 30° sería una mejora de 64 veces.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X