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
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
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 là
Rémi
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.
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;
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 :
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.
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.
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
fera un zoom par 3.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 VecteurX := point(3,0); VecteurY := point(0,-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.
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.
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager