2010-12-13 12 views
10

Quiero construir un CGPathRef programáticamente basado en las coordenadas del Sol en diferentes puntos del día. Cálculo de los puntos no es un problema, pero quiero hacer un CGPathRef que sea suave y pensó que CGPathAddCurveToPoint sería apropiado.¿Qué significan los parámetros para CGPathAddCurveToPoint?

Entiendo los parámetros path, transform, xey, pero no estoy seguro de los demás. Según la documentación de Apple, son los puntos de control, y supongo que son como los que verías en un programa de dibujo vectorial donde puedes ajustar la forma en que la curva pasa por el punto.

Mi pregunta es cómo elegir puntos que se relacionan con mis coordenadas sin saber cuáles son esas coordenadas antes de tiempo? Estoy pensando que tal vez solo restar una cantidad establecida de cada uno de los primeros puntos de control y agregar la misma cantidad a los segundos puntos de control, pero eso suena más simplificado para mí. ¿Existe un método estándar para generar puntos de control que "tengan sentido" para una curva suave?

void CGPathAddCurveToPoint (
    CGMutablePathRef path, 
    const CGAffineTransform *m, 
    CGFloat cp1x, 
    CGFloat cp1y, 
    CGFloat cp2x, 
    CGFloat cp2y, 
    CGFloat x, 
    CGFloat y 
); 
+0

Desde que encontré esta pregunta mientras toma este problema: Si está acostumbrado a software de gráficos vectoriales como Illustrator, el significado de los puntos de control es ligeramente diferente de lo que se usa en Core Graphics. Si tiene una ruta [(a1, p1, b1), (a2, p2, b2), ...] donde pi son los puntos y ai son los puntos de control conectados visualmente a ellos, la ruta equivalente en Core Graphics comenzaría con [(b1, p2, a2), ...] (después de moveToPoint para p1). Espero que esto sea útil para alguien. – mrueg

Respuesta

6

Los puntos adicionales son los puntos de control de Bezier para la curva de punto de origen (corriente) y la curva en el punto de destino (ver http://en.wikipedia.org/wiki/Bézier_curve para una explicación general). La línea currentX, currentY - cp1x, cp1y es el vector 'out' del punto actual y cp2x, cp2y - x, y es el vector 'in' hasta el punto final.

una forma razonable para producir una curva suave de P1 a P2 (suponiendo 4 puntos p0, p1, p2, p3) es (pseudocódigo):

v = (strength of curve from 0.0 to 1.0) 
cp1x = p1.x+v*(p1.x-p0.x) 
cp1y = p1.y+v*(p1.y-p0.y) 
cp2x = p2.x-v*(p3.x-p2.x) 
cp2y = p2.y-v*(p3.y-p2.y) 

Para el punto de partida, establecer cp1x, cp1y a el inicio x, y y para el punto final establecen cp2x, cp2y a la terminación x, y.

NOTA: He actualizado la respuesta a incorporar los comentarios de ughoavgfhw

+2

Denis escribe que se trata de puntos de control, pero se equivoca sobre su uso. cp1x, cp1y da el vector FUERA del punto CORRIENTE, y cp2x, xp2y le da al vector EN el punto x, y. Además, usar el último y el siguiente punto probablemente te dará líneas rectas. Lo siento, pero no puedo decirte cómo debes calcular los puntos, pero puedo sugerir probar CGPathAddArcToPoint en su lugar. – ughoavgfhw

Cuestiones relacionadas