2010-12-13 44 views
10

Je veux construire un CGPathRef par programme en fonction des coordonnées du soleil à différents moments de la journée. Calculer les points n'est pas un problème, mais je veux faire un CGPathRef qui est lisse et pensé CGPathAddCurveToPoint serait approprié. Je comprends les paramètres de chemin, de transformation, de x et de y, mais je ne suis pas sûr des autres. Selon la documentation d'Apple, ils sont les points de contrôle, et je suppose qu'ils sont comme vous le verriez dans un programme de dessin vectoriel où vous pouvez ajuster la façon dont la courbe passe à travers le point.Que signifient les paramètres de CGPathAddCurveToPoint?

Ma question est de savoir comment choisir les points qui se rapportent à mes coordonnées sans savoir quelles sont ces coordonnées à l'avance? Je pense peut-être juste soustraire un montant fixe de chacun des premiers points de contrôle et ajouter la même quantité au deuxième point de contrôle, mais cela semble simplifié pour moi. Existe-t-il une méthode standard pour générer des points de contrôle qui "ont du sens" pour une courbe régulière?

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

Depuis que je trouve cette question tout en ayant ce problème: Si vous utilisez un logiciel de graphiques vectoriels tel que Illustrator, la signification des points de contrôle est légèrement différent de ce qui est utilisé dans Core Graphics. Si vous avez un chemin [(a1, p1, b1), (a2, p2, b2), ...] où pi sont les points et ai sont les points de contrôle visuellement connectés à eux, le chemin équivalent dans Core Graphics commencerait avec [(b1, p2, a2), ...] (après un moveToPoint pour p1). J'espère que cela est utile à quelqu'un. – mrueg

Répondre

6

Les points supplémentaires sont les points de contrôle de Bézier pour la courbe de point de la source (de courant) et la courbe dans le point cible (voir http://en.wikipedia.org/wiki/Bézier_curve pour une explication générale). La ligne currentX, currentY - cp1x, cp1y est le vecteur 'out' du point courant et cp2x, cp2y - x, y est le vecteur 'in' au point final.

Une façon raisonnable pour produire une courbe lisse de p1 à p2 (en supposant 4 périodes p0, p1, p2, p3) est (pseudocode):

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) 

Pour le point de départ, définir cp1x, cp1y à le début x, y et pour le point final cp2x, cp2y à la fin x, y.

NOTE: Je l'ai mis à jour la réponse à incorporer les commentaires de ughoavgfhw

+2

Denis écrit à propos d'eux qu'ils sont des points de contrôle, mais mal à propos de leur utilisation. cp1x, cp1y donne le vecteur OUT du point CURRENT, et cp2x, xp2y donne le vecteur INTO au point x, y. En outre, l'utilisation des points précédents et suivants vous donnerait probablement des lignes droites. Désolé, mais je ne peux pas vous dire comment calculer les points, mais je peux suggérer d'essayer CGPathAddArcToPoint à la place. – ughoavgfhw