Dessiner des points

macvelottemacvelotte Membre
09:50 modifié dans API AppKit #1
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 ? :(

Réponses

  • AliGatorAliGator Membre, Modérateur
    09:50 modifié #2
    Via NSBezierPath par exemple.
    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.

  • macvelottemacvelotte Membre
    09:50 modifié #3
    Je cherche à  dessiner des points isolés, et c'est bien ce qui pose problème ...
  • AntilogAntilog Membre
    09:50 modifié #4
    Le plus simple que je connaisse:

    [NSBezierPath strokeLineFromPoint:point1 toPoint:point2]
    


    Avec point1 = point2
  • macvelottemacvelotte Membre
    09:50 modifié #5
    à  Antilog : négatif ! Il ne se passe rien !
  • AliGatorAliGator Membre, Modérateur
    09:50 modifié #6
    Moi quand j'ai dit "C'est peut être pas [la solution] la plus adéquate [...], mais c'est la plus simple", dedans tu lis que c'est donc une solution qui marche.
    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.
  • 09:50 modifié #7
    Pas si sur que ça marche direct. Il faudrait peut etre changer le capStyle par défaut pour que ça marche:
    [NSBezierPath setDefaultLineCapStyle:NSRoundLineCapStyle]; //ce code n'est à  exécuter qu'une seule fois.
  • macvelottemacvelotte Membre
    09:50 modifié #8
    [NSBezierPath strokeLineFromPoint:point1 toPoint:point2]
    

    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 ?
  • macvelottemacvelotte Membre
    09:50 modifié #9
    <br />-(void)tracer<br />{<br />	NSPoint S1,S2,S3,P0,PC,PC1;<br />	S1.x=950;<br />	S1.y=680;<br />	S2.x=480;<br />	S2.y=10;<br />	S3.x=10;<br />	S3.y=680;<br />	P0.x=300;<br />	P0.y=300; <br />	long total;<br />	[[NSColor blueColor] set];<br />	[NSBezierPath setDefaultLineCapStyle:NSRoundLineCapStyle];<br />	int s;<br />	total=0;<br />	do<br />		{<br />			s = (random() % 3)+1;<br />			switch(s)<br />				{<br />				case 1:<br />					{<br />						PC.x=(S1.x+P0.x)/2;<br />						PC.y=(S1.y+P0.y)/2;<br />						break;<br />					}<br />				case 2:<br />					{<br />						PC.x=(S2.x+P0.x)/2;<br />						PC.y=(S2.y+P0.y)/2;<br />						break;<br />					}<br />				case 3:<br />					{<br />						PC.x=(S3.x+P0.x)/2;<br />						PC.y=(S3.y+P0.y)/2;<br />						break;<br />					}<br />				}<br />			PC1.x=PC.x;<br />			PC1.y=PC.y+0.5;<br />			[NSBezierPath strokeLineFromPoint:PC toPoint:PC1];<br />			P0.x=PC.x;<br />			P0.y=PC.y;<br />			total++;<br />		}<br />	while (total&lt;200000);<br />						<br />}<br /><br />
    

    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]
  • Eddy58Eddy58 Membre
    janvier 2006 modifié #10
    dans 1138628340:

    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 ?


    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]
  • macvelottemacvelotte Membre
    09:50 modifié #11
    -(void)mouseDown:(NSEvent *)event<br />{<br />&nbsp;  NSPoint posSouris=[self convertPoint:[event locationInWindow] fromView:nil];<br />&nbsp;  [super mouseDown:event];<br />}<br />
    

    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. :-\\
  • Eddy58Eddy58 Membre
    janvier 2006 modifié #12
    D'où appelles tu ta méthode -(void)tracer ?
    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]
  • macvelottemacvelotte Membre
    09:50 modifié #13
    Merci Eddy58,

    La View dans laquelle je fais les clics n'apparaà®t pas avant la fonction "tracer" : où est le bug ?
  • Eddy58Eddy58 Membre
    09:50 modifié #14
    Rajoute une demande d'affichage en fin d'initialisation : :o
    [tt]
    -(void)awakeFromNib
    {
        clicksCount=0;
        [self setNeedsDisplay:YES];
    }
    [/tt]
  • macvelottemacvelotte Membre
    09:50 modifié #15
    ça ne change rien ...
  • Eddy58Eddy58 Membre
    janvier 2006 modifié #16
    Ok, rajoutons une condition pour l'initialisation. Si cela ne fonctionne pas, je vois pas d'où ça peut venir sans en savoir plus... :o
    [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]
  • macvelottemacvelotte Membre
    09:50 modifié #17
    Je n'ai pas encore eu le temps d'étudier la proposition d'Eddy58.

    Je ferai part de mes conclusions demain ou même peut-être un peu plustard.

    Merci !
  • macvelottemacvelotte Membre
    09:50 modifié #18
    Je n'ai rein fait depuis la fin janvier ...

    Je devais répondre à  Eddy58 : ses suggestions sont OK ! Merci !
Connectez-vous ou Inscrivez-vous pour répondre.