Coordonnées dans une NSBitmapImageRep

AliGatorAliGator Membre, Modérateur
décembre 2005 modifié dans API AppKit #1
Bijour tout li monde  <3 <br />
Alors j'ai des petits soucis avec NSBitmapImageRep.
J'ai une NSImage et je voudrais savoir la valeur de la couche alpha d'un pixel donné : mes images sont des pièces dans mon jeu et je veux savoir si on a cliqué la pièce ou pas, donc si le point cliqué est opaque (alpha>0.5) ou transparent

Mes images à  l'origine sont des PNG. Voilà  un extrait de mon code pour ma sous-classe gameBoard de NSView :

[tt]- (BOOL)isPoint:(NSPoint)loc inTileAtColumn:(int)col row:(int)row
{
if ( (col<0) || (col>=[self columnCount]) || (row<0) || (row>=[self rowCount]) )
return NO;
NSSize slice = [self sliceSize];

// récupération de l'image de la pièce et de sa bitmapRep
NSImage* tile = [self tileForValue:[delegate valueAtColumn:col row:row] selected:NO];
NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData:[tile TIFFRepresentation]];

// coordonnées du point dans l'image
NSPoint vect = NSMakePoint(loc.x - col*slice.width, loc.y - row*slice.height);
NSColor* clr = [bitmap colorAtX:vect.x y:[self tileFullSize].height-vect.y]; // FIXME : BitmapRep is vertically flipped ??!?

if (clr == nil) return NO;
float alphaPix = [clr alphaComponent];
NSLog(@color at %@ has alpha %.2f",NSStringFromPoint(vect),alphaPix);
if (alphaPix>0.5) NSLog(@   >> tile is candidate !);
return (alphaPix>0.5);
}[/tt]

"slice" c'est la dimension d'un "découpage" de ma grille, à  savoir la taille "au sol" d'une case (j'ai un effet fausse 3D sur mes pièces) + la taille de l'espace entre les cases. Multipliés par col et row ça me donne donc les coordonnées du point en bas à  droite de la case {col,row}, pour ainsi calculer les coordonnées du point cliqué dans le repère de l'image tile.

Mon problème se situe au niveau du FIXME : en effet j'ai fait un sacré paquet de tests et tout porte à  croire que mes images ont des coordonnées inversées par rapport au système de coordonnées habituel.
En effet si je clique en bas à  droite de mon image (vect = {130,2} par exemple), la valeur de mon alpha correspond plutôt au point en haut à  droite ({130,134-2} vu que mes pièces font 134x134)
J'ai donc inversé la valeur du 'y' (height-y) pour faire comme si mon origine était en haut à  gauche et non en bas à  gauche dans bitmap. Mais c'est tout mon problème : je ne comprends pas pourquoi j'ai à  faire ça.
Les coordonnées seraient-ils vraiment inversés dans une NSBitmapImageRep ?

J'ai eu beau chercher dans la doc (et emmerder Renaud via Adium ::) :P) je n'ai trouvé aucune trace d'une pseudo-inversion de coordonnées... Alors c'est quoi cette histoire, pourquoi j'ai à  inverser mes coordonnées ?
Pour info si je demande [tile isFlipped] on me répond NO donc ça ne vient pas de là . (sait-on jamais)

:why?:

Au passage aussi, je n'ai pas touché à  la frame ou aux bounds de ma vue. Pourtant j'ai un autre truc bizarre (mais c'est un autre problème, à  moins que ?) c'est que quand je clique dans la ligne la plus basse de ma vue, la valeur du y est 1 et non zéro : si je descend ma souris d'un pixel vers le bas et que je reclique, ça ne clique pas dans la vue. comme si mon frameOrigin était à  {0,-1} pourtant je n'ai pas modifié ni le frame ni les bounds de ma vue...

Réponses

  • AliGatorAliGator Membre, Modérateur
    13:53 modifié #2
    Personne pour m'expliquer pourquoi mes coordonnées sont inversées dans mon NSBitmapImageRep ?
  • 13:53 modifié #3
    Parce que c'est comme ça.
  • CéroceCéroce Membre, Modérateur
    13:53 modifié #4
    C'est parce que ça correspond à  la façon dont une bitmap est adressée. Une bitmap s'écrit, au niveau du pixel, dans notre sens de lecture (de droite à  gauche, et de haut en bas). Le repère d'une bitmap est ainsi fait:
    - l'origine est dans le coin supérieur gauche
    - l'axe des abscisses pointe vers la droite
    - l'axe des ordonnées pointe vers le bas

    Alors que pour les coordonnées Cocoa:
    - l'origine est en bas à  droite
    - l'axe des abscisses pointe vers la droite
    - l'axe des ordonnées pointe vers le haut
  • AliGatorAliGator Membre, Modérateur
    13:53 modifié #5
    Ben c'est bien ce que j'avais pensé...
    Je connais bien la spécification du format BMP Windows pour l'avoir décortiqué à  une époque, et je sais que l'image dans un fichier BMP est codée du bas vers le haut.
    Mais NSBitmapImageRep ne représente pas forcément le format de fichier BMP, il peut représenter du TIFF ou du PNG aussi, qui eux sont dans l'autre sens.

    Non mais ce que je ne comprend pas trop et que je trouve surprenant, c'est qu'il n'y ait aucune trace de cette "inversion de coordonnées" dans la doc ni même que personne n'en ait parlé auparavant !
  • 13:53 modifié #6
    Bien sûr qu'on en parle...

    It?s possible to refer to portions of an image when compositing by specifying a rectangle in the image?s coordinate system. While bitmap images generally consider their origin as the upper-left of the image, the default origin for the Quartz drawing system is the lower-left.
  • AntilogAntilog Membre
    13:53 modifié #7
    dans 1134471317:

    Bien sûr qu'on en parle...

    It?s possible to refer to portions of an image when compositing by specifying a rectangle in the image?s coordinate system. While bitmap images generally consider their origin as the upper-left of the image, the default origin for the Quartz drawing system is the lower-left.



    [size=15pt]Attention[/size] Renaud, il mord!!  >:)
  • 13:53 modifié #8
    Je n'ai pas à  m'inquiéter. Il a trop à  y perdre.
  • AliGatorAliGator Membre, Modérateur
    13:53 modifié #9
    Gnap ! (m'en fous j'ai épuisé mon compte de questions de toutes façons, donc finalement non j'ai pas tant que ça à  perdre ;))

    [PJ]quoi pfd ?[/PJ]

    En plus je l'ai parcourue, la doc, à  ce suejt... mais j'avais pas vu ce court passage... qui a le mérite d'être... pô clair ;) Enfin ça dit que "bien que en général les images utilisent un système de coordonnées avec l'origine en haut à  gauche, ben l'origine par défaut pour le dessinage se trouve en bas à  gauche, elle".
    Oui mais moi je fais une différence entre les fichiers images et leurs coordonnées, les représentations bitmap (NSBitmapImageRep), et le dessin. Là  il n'est pas question clairement du système de coordonénes des NSBitmapImageRep, en tout cas c'est loin d'être écrit clairement.

    Prennez par exemple ce dont je parlais plus haut : le format d'image BMP et le format TIFF par exemple : dans les fichiers BMP l'iamge est parcourue de bas en haut (comme dans Quartz), dans le TIFF c'est de haut en bas. C'est pas ça qui va nous dire ce qu'Apple a choisi comme système de coordonnées pour son NSBitmapImageRep !

    [PJ]quoi, ebfd ? oui, je sais...[/PJ]
Connectez-vous ou Inscrivez-vous pour répondre.