Dessiner des points
macvelotte
Membre
Il y avait dans l'antiquité de l'informatique la fonction "plot". On pouvait y suppléer en C par les deux instructions successives "moveTo, puis lineTo".
Comment tracer des points en ObjC ?
Comment tracer des points en ObjC ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce n'est pas la seule solution il me semble, et peut-être pas la plus adéquate si tu veux dessiner des points isolés, mais la plus simple si tu veux dessiner un graphique avec des poitns qui se relient entre eux.
Avec point1 = point2
Donc que c'est pas parce que tu veux dessiner des points isolés (et que j'ai dit que si c'était pour ds points reliés c'était encore mieux adapté) que ça ne marche pas
normalement tu fais un [tt]strokeLineFromPoint:(NSPoint) toPoint:(NSPoint)[/tt] comme te l'indique Antilog et ça devrait marcher. Quitte à essayer avec 2 points différents pour dessiner une ligne avant d'essayer avec 2 points identiques pour n'avoir qu'un point isolé.
Ca marche à condition bien sûr d'avoir choisi la couleur avant avec un set sur la (NSColor*).
NB : strokeLineFromPoint:toPoint est une méthode de classe, pas d'instance : pas besoin d'instancier un NSBezierPath avant, au cas où tu aurais essayé de passer par là : suis juste à la lettre le code d'AntiLog.
En vérifiant que les coordonnées de ton point1 et point2 sont dans les bons systèmes de coordonnées bien sûr. Commence par tracer une ligne pour vérifier tout ça.
[NSBezierPath setDefaultLineCapStyle:NSRoundLineCapStyle]; //ce code n'est à exécuter qu'une seule fois.
donne quelquechose si point1?point2. et rien si point1=point2 : j'ai donc une solution, qui ne me satisfait pas totalement, mais qui permet de voir quelquechose se passer à l'écran !
Question subsidiaire : comme obtenir les coordonnées d'un clic souris ?
voici le code qui permet d'obtenir l'image joint. ça ne parche qu'avec un triangle !
...et je souhaite définir le triangle par 3 clics ... un quatrième lançant le dessin.
[Fichier joint supprimé par l'administrateur]
Perso, je désactive l'anti-aliasing et joue ensuite sur les demies-unitées pour obtenir un point/pixel.
[tt]
  NSGraphicsContext *contexte;
  NSPoint origin;
  // Désactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:NO];
  // Opérations de tracé
  [NSBezierPath strokeLineFromPoint:NSMakePoint(origine.x+0.5,origine.y) toPoint:NSMakePoint(origine.x+0.5,origine.y+0.5)];
  // Réactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:YES];
[/tt]
Pour la position de la souris, il faut sous-classer ta view puis surcharger mouseDown.
[tt]
-(void)mouseDown:(NSEvent *)event
{
 NSPoint posSouris=[self convertPoint:[event locationInWindow] fromView:nil];
[super mouseDown:event];
}
[/tt]
Code donné par Eddy58 : ma vue doit être tracée avant de promener la souris dessus : là , j'ai un problème sans aucun doute trivial ...mais je n'ai pas de solution. :-\\
En surchargeant -(void)drawRect:(NSRect)rect tu peux faire un truc dans le genre, en comptant les cliques : (le tracé s'effectue dès que le 3e point est connu)
D'abord, tu transfères les déclarations de tes points dans l'interfaçage :
[tt]
   NSPoint S1;
   NSPoint S2;
   NSPoint S3;
   NSPoint posSouris;
   int clicksCount;
[/tt]
[tt]
-(void)awakeFromNib
{
   clicksCount=0;
}
-(void)drawRect:(NSRect)rect
{
  NSGraphicsContext *contexte;
  if (clicksCount==0)
  {
    [[NSColor whiteColor] set];
    NSRectFill(NSMakeRect(rect)); // Réinitialiser la vue
    S1=posSouris;
    clicksCount=1;
  }
  if (clicksCount==1)
  {
    S2=posSouris;
    clicksCount=2;
  }
  if (clicksCount==2)
  {
    S3=posSouris;
    clicksCount=3;
  }
 Â
  // Désactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:NO];
  if (clicksCount<3)
  {
    [NSBezierPath strokeLineFromPoint:NSMakePoint(posSouris.x+0.5,posSouris.y) toPoint:NSMakePoint(posSouris.x+0.5,posSouris.y+0.5)];
  }
  else
  {
     clicksCount=0;
     [self tracer]
  }
  // Réactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:YES];
}
-(void)mouseDown:(NSEvent *)event
{
  posSouris=[self convertPoint:[event locationInWindow] fromView:nil];
  [self setNeedsDisplay:YES];
  [super mouseDown:event];
}
[/tt]
La View dans laquelle je fais les clics n'apparaà®t pas avant la fonction "tracer" : où est le bug ?
[tt]
-(void)awakeFromNib
{
clicksCount=0;
[self setNeedsDisplay:YES];
}
[/tt]
[tt]
-(void)awakeFromNib
{
   clicksCount=4;
   [self setNeedsDisplay:YES];
}
-(void)drawRect:(NSRect)rect
{
  NSGraphicsContext *contexte;
  if (clicksCount==4) // Pour l'initialisation
  {
    [[NSColor whiteColor] set];
    NSRectFill(NSMakeRect(rect)); // Initialiser la vue
    return;
  }
  if (clicksCount==0)
  {
    [[NSColor whiteColor] set];
    NSRectFill(NSMakeRect(rect)); // Réinitialiser la vue
    S1=posSouris;
    clicksCount=1;
  }
  if (clicksCount==1)
  {
    S2=posSouris;
    clicksCount=2;
  }
  if (clicksCount==2)
  {
    S3=posSouris;
    clicksCount=3;
  }
 Â
  // Désactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:NO];
  if (clicksCount<3)
  {
    [NSBezierPath strokeLineFromPoint:NSMakePoint(posSouris.x+0.5,posSouris.y) toPoint:NSMakePoint(posSouris.x+0.5,posSouris.y+0.5)];
  }
  else
  {
     clicksCount=0;
     [self tracer]
  }
  // Réactivation de l'anti-aliasing
  contexte=[NSGraphicsContext currentContext];
  [contexte setShouldAntialias:YES];
}
-(void)mouseDown:(NSEvent *)event
{
if (clicksCount==4)
{
clicksCount=0;
}
posSouris=[self convertPoint:[event locationInWindow] fromView:nil];
[self setNeedsDisplay:YES];
[super mouseDown:event];
}
[/tt]
Je ferai part de mes conclusions demain ou même peut-être un peu plustard.
Merci !
Je devais répondre à Eddy58 : ses suggestions sont OK ! Merci !