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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    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 émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 139
    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;

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

    Informations professionnelles :
    Activité : Développeur informatique

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

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

    Cordialement,
    Martinux

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    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 averti
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    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.

+ 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