IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Quadriller un Timage [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    Points : 23
    Points
    23
    Par défaut Quadriller un Timage
    Bonjour
    J'utilise Lazarus et j'aimerais savoir comment on peut quadriller un Timage afin de repérer des points par leurs coordonnées.
    J'utilise un Tstringgrid en parallèle.
    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Peux tu être plus précis.
    Sinon un moyen de connaître le couleur d'un point c'est d'utiliser la propriété Pixels du Canvas de ton TImage
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function MaCouleur(Timage MonImage;x,y:integer):TColor;
    begin
     MaCouleur:=MonImage.Canvas.Pixesl[x,y];
    end;
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Si tu veux dessiner un quadrillage, donc des lignes horizontales et verticales, tu peux utiliser Canvas.LineTo

    Cordialement,
    Martinux
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    Bonjour
    Je ne sais pas comment localiser la position de ma souris et dans ce cas faire dessiner une dans la case de la grille que j'ai réaliser.
    Je vous donne mon code pour tracer la grille et pour passer d'un repère de type méca classique x vers la droite y vers le haut à un repère Timage x vers la droite y vers le bas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Function Coordonnee_to_pixel_x (aP : CPoint; aImage :TImage):integer;
    Begin
         Coordonnee_to_pixel_x := aP.Getfx*round(longueur_barre*0.5);
    end;
     
    Function Coordonnee_to_pixel_y (aP : CPoint; aImage :TImage):integer;
    Begin
         Coordonnee_to_pixel_y := aImage.Canvas.Height - aP.Getfy()*round((longueur_barre/2)*sqrt(3));
    end;
     
     
    Procedure Pixel_to_Coordonnee (Var aP : CPoint; x,y :integer; aImage :Timage);
    Begin
         aP.Setfx(round(x/round(longueur_barre*0.5)));
         aP.Setfy(round((aImage.Canvas.Height - y)/round((longueur_barre/2)*sqrt(3))));
    end;
     
    Procedure tracer_trait_xy (aImage : Timage; Pd,Pf : CPoint);
    Begin
         aImage.canvas.MoveTo(Coordonnee_to_pixel_x (Pd,aImage) , Coordonnee_to_pixel_y (Pd,aImage));
         aImage.canvas.LineTo(Coordonnee_to_pixel_x (Pf,aImage) , Coordonnee_to_pixel_y (Pf,aImage));
    end;  
     
    Procedure quadrillage (var aImage:Timage); // procédure qui fait le quadrillage
    Var x,y :integer;
    Begin
         x := 0;
         y := 0;
         While x<aImage.Canvas.Width do
         Begin
              aImage.Canvas.pen.Color:=clGreen;
              aImage.Canvas.MoveTo(x,0);
              aImage.Canvas.LineTo(x,aImage.Canvas.Height);
              x := x + round(longueur_barre*0.5);
         end;
         While y<aImage.Canvas.Height do
         Begin
              aImage.Canvas.pen.Color:=clGreen;
              aImage.Canvas.MoveTo(0,y);
              aImage.Canvas.LineTo(aImage.Canvas.Width,y);
              y := y + round((longueur_barre/2)*sqrt(3));
         end;
    end;

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Proposition
    Je pense qu'il faut prendre un peu de recul...

    Si j'avais à réaliser ce que tu dois faire, j'associerai à mon Image 3 paramètres globaux supplémentaires permettant de définir un repère (O,X,Y) et d'utiliser ce repère pour transformer tes points avant de faire le dessin.

    Cela te permettera aussi de faire des dessin en utilisant une échèlle autre que celle du canvas (1pixel = une unité de dessin) et aussi d'avoir des reperes non orthonormés.

    Treve de bla bla, passons à l'action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    unit Unit1; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
      ExtCtrls, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button2: TButton;
        Image1: TImage;
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
     
        FOrigine: Tpoint;
        FVecteurX: Tpoint;
        FVecteurY: TPoint;
     
        procedure SetOrigine(const AValue: Tpoint);
        procedure SetVecteurX(const AValue: Tpoint);
        procedure SetVecteurY(const AValue: TPoint);
        { private declarations }
     
     
     
      public
        { public declarations }
     
        property Origine  : Tpoint read FOrigine write SetOrigine;
        property VecteurX : Tpoint read FVecteurX write SetVecteurX;
        property VecteurY : TPoint read FVecteurY write SetVecteurY;
     
        procedure Initialisation;
     
        function ImageCoord(aRealPoint:TPoint):TPoint;
      end; 
     
    var
      Form1: TForm1; 
     
    implementation
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Initialisation;
    end;
     
     
     
    procedure TForm1.SetOrigine(const AValue: Tpoint);
    begin
      FOrigine:=AValue;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      P1, P2 : TPoint;
      P1Image ,P2Image : TPoint;
    begin
      // Cette procedure trace dans un repere std un segment de [0;0] à [20;50]
      // L'origine etant le centre de l'image; le vecteur X par la droite et le vecteur Y par le haut
     
      Image1.Canvas.pen.Color:=clRed;
     
      P1 := POINT(0,0);
      P2 := POINT(20,50);
     
      P1Image := ImageCoord(P1);
      P2Image := ImageCoord(P2);
     
      Image1.Canvas.MoveTo(P1Image.X,P1Image.Y);
      Image1.Canvas.lineTo(P2Image.X,P2Image.Y);
    end;
     
     
     
    procedure TForm1.SetVecteurX(const AValue: Tpoint);
    begin
      FVecteurX:=AValue;
    end;
     
    procedure TForm1.SetVecteurY(const AValue: TPoint);
    begin
      FVecteurY:=AValue;
    end;
     
    procedure TForm1.Initialisation;
    begin
       FOrigine.x := Image1.Width div 2;
       FOrigine.y := Image1.Height div 2;
     
       VecteurX.X := 1;
       VecteurX.y := 0;
     
       VecteurY.x := 0;
       VecteurY.y := -1;
    end;
     
    function TForm1.ImageCoord(aRealPoint: TPoint): TPoint;
    begin
      result.X := Origine.X+VecteurX.X*aRealPoint.X + VecteurY.X*aRealPoint.Y;
      result.Y := Origine.Y+VecteurX.Y*aRealPoint.X + VecteurY.Y*aRealPoint.Y;
    end;
     
    initialization
      {$I unit1.lrs}
     
    end.
    Dans cet exemple j'initialise mon repère en prenant pour origine le centre de l'image et un vecteur X allant vers la droite et un vecteur Y allant vers le haut.

    J'ai écrit une fonction simple permettant de passer de coordonées reélles en coordonnées image. Je te laisse le soin d'écrire la procédure inverse qui te sera utile pour connaitre les coordonnées "Reelle" du clic de souris.

    Ensuite, à titre d'exemple, je trace un segment partant de l'origine vers le point (20;50).

    Note que tu peux changer l'échelle de ton dessin en modifiant l'initialisation, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     VecteurX := point(3,0);
     VecteurY := point(0,-3);
    fera un zoom par 3.

    Tu peux aussi changer l'origine de la même facon.

    et aussi deformer ton dessin si la norme de X est différente de la norme de Y.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    Bonjour
    Dans mon exemple les deux pas suivant x et suivant y doivent être lié pour cette raison j'ai crée une constante globale longueur_barre qui sert dans les deux cas. merci pour ta réponse.

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    J'ai réussi à faire des zones où on peut cliquer avec la souris sur le Timage voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Type t_Tab = Array[1..10, 1..3] of CPoint;
    Var P1, P2, Point1, Point2 : CPoint; i : integer; tableau_Point : t_Tab;
    begin
         Point1 := CPoint.Create(0,0);
         Point2 := CPoint.Create(0,0);  // Initialisation des deux points qui définissent la zone
     
    // Faire le tracé de la zone de repérage de la souris avec une fonction pour voir
         For i:=1 to 10 do
         Begin
              tableau_Point[i,1] := CPoint.Create(i,1);             // MATRICE de point 1ère ligne point d'application possible de la force
              Zone_clic (Image1, tableau_Point[i,1], Point1 , Point2 );    //2è et 3è lignes points définissant la zone de clic
              tableau_Point[i,2] := Point1;
              tableau_Point[i,3] := Point2;
         end;
     
         For i:= 1 to 10 do
         Begin
              if (Y > tableau_Point[i,3].Getfy) and (Y < tableau_Point[i,2].Getfy)     // Définit la zone autour du point
              and (X > tableau_Point[i,3].Getfx) and (X < tableau_Point[i,2].Getfx)
              then  Tracer_Force(Image1, tableau_Point[i,1]);                   //Trace la force en ce point
         end;
     
     
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  2. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  3. vider un timage
    Par gIch dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/08/2002, 23h58
  4. TImage
    Par Thylia dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/07/2002, 20h03
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo