Flipper un path avec quartz

laurrislaurris Membre
15:27 modifié dans API AppKit #1
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.

Réponses

  • Philippe49Philippe49 Membre
    juillet 2008 modifié #2
    x --> 2* constante - x
    y --> y

    constante est la valeur de x sur l'axe de symétrie
  • laurrislaurris Membre
    15:27 modifié #3
    Merci, mais dans quoi je mets ces paramètres ? En utilisant les methodes CGContext, je vois du CGContextScaleCTM(),  du CGContextTransformCTM(), mais ça n'a pas l'air d'être ça. Il faut remplir directement la matrice, non ?
    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).
  • Philippe49Philippe49 Membre
    octobre 2008 modifié #4
    Tape CGAffineTransform dans la doc

    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.);


  • laurrislaurris Membre
    15:27 modifié #5
    Merci Philippe,
    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);

  • Philippe49Philippe49 Membre
    15:27 modifié #6
    je sais que l'on peut appliquer à  un NSBezierPath une NSAffineTransform
    [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

  • Philippe49Philippe49 Membre
    15:27 modifié #7
    Ou alors peut-être appliquer la transformation au niveau du contexte, mais c'est plus lourd puisqu'il faut faire un save puis un restore.
  • laurrislaurris Membre
    15:27 modifié #8
    Arg, j'ai compris.

    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.
Connectez-vous ou Inscrivez-vous pour répondre.