Flipper un path avec quartz
laurris
Membre
Bonjour à tous,
J'ai un problème quartz tout simple mais je m'y perds un peu.
Je suis dans une fonction drawRect: dans laquelle j'ai construit un path_1. Je voudrais flipper ce path selon un axe vertical et obtenir un nouveau path_2.
Quelle est la solution la plus efficace ? à lire la doc, il faudrait créer une affine transform mais laquelle exactement ? Si c'est la fonction CGAffineTransformMakeTranslation(), quelles sont les valeurs à mettre dans la matrice ?
Merci pour vos lumières.
J'ai un problème quartz tout simple mais je m'y perds un peu.
Je suis dans une fonction drawRect: dans laquelle j'ai construit un path_1. Je voudrais flipper ce path selon un axe vertical et obtenir un nouveau path_2.
Quelle est la solution la plus efficace ? à lire la doc, il faudrait créer une affine transform mais laquelle exactement ? Si c'est la fonction CGAffineTransformMakeTranslation(), quelles sont les valeurs à mettre dans la matrice ?
Merci pour vos lumières.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
y --> y
où constante est la valeur de x sur l'axe de symétrie
Ou alors utiliser une affine transform avec CGAffineTransformMake() , mais dans ce cas quoi mettre comme autres paramètres ? (j'ai enterré les matrices en même temps que ma vie lycéenne).
struct CGAffineTransform {
  CGFloat a;
  CGFloat b;
  CGFloat c;
  CGFloat d;
  CGFloat tx;
  CGFloat ty;
};
typedef struct CGAffineTransform CGAffineTransform;
et plus loin :
x'=a*x+c*y+tx
y'=b*x+d*y+ty
CGAffineTransform transform=(CGAffineTransform){.a=-1.0 , .d=1.0 , .tx=2*constante};
ou utiliser CGAffineTransform CGAffineTransformMake (
  CGFloat a,
  CGFloat b,
  CGFloat c,
  CGFloat d,
  CGFloat tx,
  CGFloat ty
);
CGAffineTransform transform=CGAffineTransformMake(-1.0 ,0.,0.,0.,1.0 ,2*constante,0.);
C'est vrai qu'avec les equations on comprend tout de suite comment ça marche.
Cela étant, le path se dessine mais sans la transformation. J'ai regardé les exemples dans la doc, ils utilisent la transformation de matrice pour dessiner une image ou alors un NSString. Est-ce que ça marche dans ces cas mais pas avec un path ?
Moi j'utilise CGContextDrawPath(context, kCGPathFillStroke);
[myBezierPath transformUsingAffineTransform:transform]
La transformation est alors appliquée à tous les points du BezierPath , points de contrôle compris.
Regarde si il existe quelque chose de semblable pour les CGPath
D'après la doc, le current path ne fait pas partie du contexte (?!). Donc une modif de la matrice du contexte n'a pas d'effet dessus.
Il faut donc modifier la matrice du contexte avec une affine transform puis créer un path à part et l'ajouter au contexte avec CGContextAddPath(). Et ça le fait.
Ca m'a l'air un peu fastidieux mais je ne vois pas d'autre moyen pour l'instant.