Qui saurait resoudre un Gros Problem pour tester des pixel ! Un Defi !

Signaler
Messages postés
17
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2004
-
Messages postés
17
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2004
-
Bonjour a tous ! j'ai vraiment un gros problem sur delphi 7,
alors est-ce que Delphi Bug, ou alors c'est le language, en tout qu'a c'est vraiment bizarre.

Voici un exemple tout bete de ce que je voudrait faire, mais je n'y arrive pas. Pourquoi ?

Sur un composant TImage je dessine des trait sans probleme
particulier, des trait tout bete d'une eppaisseur de 1 pixel.
Jusque la ça va, en faite c'est que quand j'ai 2 trait qui se croise, je voudrait dessiner un point d'intersection, un petit carré de 3 pixels de coté tout en noir qui ferait mine de relier ces 2 trait, ceci na pas l'air compliquer a premiere vue, mais le problem est que je n'arrive pas a tester la couleur des pixel pour dessiner ce petit point, donc pourquoi ?

Pour vous faire une idee voici le code, sachant que pour avoir une connection, il faut au minimum une intersection de 3 trait, donc 3 ou 4 pixels partants de chaque coté, et bien entendus les ligne de dessins sont toutes perpendiculaire, c'est a dire Horizontale ou Verticale.
Vous avez plus qu'a faire un copier coller du code que voici, et n'oublier de rajouter un TImage sur TForm1.
Je remercie par avance les personne qui prendront le temps d'essayer ceci, car j'ai tout essayer et cela ne veut vraiment pas fonctionner, c'est vraiment bizarre !

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ToolWin, ComCtrls, jpeg, StdCtrls;

type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
ToolBar1: TToolBar;
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;
DX,DY,memx,memy,AX,AY,RX,RY,Z,SX,SY,W,h:Integer;
line:boolean;
RRX,RRY:Real;
B:Array[0..4,0..4]of Integer;


implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
line:=true;//Autorise a tracer la ligne
RRX:=X/15; RRY:=Y/15; DX:=Round(RRX); DY:=Round(RRY);
DX:=DX*15;//Multiplie par les pas de grille pour trouver le pixel en X
DY:=DY*15;
Image1.Canvas.MoveTo(DX,DY);//Point de depart de la ligne sur la grille
memx:=DX; memy:=DY; SX:=X; SY:=Y;//Memoriser l'origine
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Image1.Canvas.Pixels[X,Y]=RGB(254,254,254) then
Image1.Cursor:=crCross//Si detection de la grille affichage de la main
else
Image1.Cursor:=crDefault;//Sinon icone croix
if line then//Si il y a un clic gauche ou droit alors execution
begin
with Image1.Canvas do
begin
Pen.Width:=1;//Epaisseur de la ligne
Pen.Mode:=pmnotxor;//MoveTo 1 Efface, MoveTo 2 Dessine, ce mode bascule entre les 2 MoveTo
MoveTo(DX,DY);//Depart de la ligne d'effacement
LineTo(memx,memy);//Arriver de la ligne d'effacement
MoveTo(DX,DY);//Depart de la ligne de dessin
LineTo(X,Y);//Arriver de la ligne de dessin
end;
end;
memx:=X; memy:=Y;//Enregistrement du dernier point en Y
Image1.Canvas.Pen.Mode:=pmcopy;//Couleur du crayon
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

begin
line:=false;//Fin d'autorisation de tracer de ligne
RRX:=X/15; RRY:=Y/15; AX:=Round(RRX); AY:=Round(RRY);//Calcul du plus petit ecart
AX:=AX*15; AY:=AY*15; RX:=Abs(DX-AX); RY:=Abs(DY-AY);//entre origine Y et arriver Y
if RX<RY then
AX:=DX//Si l'axes des X est pret de l'origine
else if RX>RY then
AY:=DY//Si l'axes des Y est pret de l'origine
else if RX=RY then
AX:=DX;//Priorité a l'axes des X
with Image1.Canvas do
begin
Pen.Width:=1;//Epaisseur de la ligne
Pen.Mode:=pmnotxor;//Mode NotXOR pour alterner entre la couleur du fond et celle du crayon
MoveTo(DX,DY);//Depart de la ligne d'effacement
LineTo(X,Y);//Effacement de la derniere ligne
MoveTo(DX,DY);//Depart de la ligne de dessin
LineTo(AX,AY);//Arriver de la ligne sur la grille
end;
if (SX=X) and (SY=Y) then
begin
with Image1.Canvas do
begin
MoveTo(DX,DY);//Depart de la ligne d'effacement
LineTo(X,Y);//Effacement de la ligne si aucun mouvement de souris
end;
end;
with Image1.Canvas do
begin
Pen.Width:=15;//Eppaisseur de ligne de 15 pixel, pour la zones de detection
Pen.Color:=RGB(254,254,254);//Couleur de ligne invisible sur le blanc
MoveTo(DX,DY);//Début du trait de detection
LineTo(AX,AY);//Fin de trait de detection
Pen.Width:=1;//Réinialisation du trait pour le suivant
Pen.Color:=RGB(0,0,0);//Couleur du trait en Noir
end;

Image1.Canvas.Pen.Mode:=pmBlack;

B[0,0]:=DX-1; B[0,1]:=DX+1;
B[0,2]:=DY-1; B[0,3]:=DY+1;
B[2,0]:=AX-1; B[2,1]:=AX+1;
B[2,2]:=AY-1; B[2,3]:=AY+1;
B[0,4]:=DY; B[1,4]:=DX;
B[2,4]:=AY; B[3,4]:=AX;

W:=0;
if Image1.Canvas.Pixels[B[0,0],B[0,4]]=clBlack then inc(W);//Teste X-1 et Y (Début du trait)
if Image1.Canvas.Pixels[B[0,1],B[0,4]]=clBlack then inc(W);//Teste X+1 et Y (Début du trait)
if Image1.Canvas.Pixels[B[0,2],B[1,4]]=clBlack then inc(W);//Teste Y-1 et X (Début du trait)
if Image1.Canvas.Pixels[B[0,3],B[1,4]]=clBlack then inc(W);//Teste Y+1 et X (Début du trait)
if W>2 then
with Image1.Canvas do
begin
Pen.Width:=3;//Eppaisseur de ligne
MoveTo(B[0,0],DY);//Depart de la connection
LineTo(B[0,1],DY);//Arriver de la connection
end;

W:=0;
if Image1.Canvas.Pixels[B[2,0],B[2,4]]=clBlack then inc(W);//Teste X-1 et Y (Fin du trait)
if Image1.Canvas.Pixels[B[2,1],B[2,4]]=clBlack then inc(W);//Teste X+1 et Y (Fin du trait)
if Image1.Canvas.Pixels[B[2,2],B[3,4]]=clBlack then inc(W);//Teste Y-1 et X (Fin du trait)
if Image1.Canvas.Pixels[B[2,3],B[3,4]]=clBlack then inc(W);//Teste Y+1 et X (Fin du trait)
if W>2 then
with Image1.Canvas do
begin
Pen.Width:=3;//Eppaisseur de ligne
MoveTo(B[2,0],AY);//Depart de la connection
LineTo(B[2,1],AY);//Arriver de la connection
end;

end;
end.

2 réponses

Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
4
Salut,

T'as une m... dans tes coordonnées :
Si B[0,1] et B[0,2] sont bien relatifs à DX, B[0,2] et B[0,3] sont eux relatifs à DY et utilisés en X.
De même :
- B[1,4] relatif à DX est utlisé en Y
- B[2,2] " " DY " " " X
- B[3,4] = DX est utilisé en Y

et y en a peut-être d'autres.

Ken@vo
____________________
Code, Code, Codec !
Messages postés
17
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2004

Je remercie Ken@vo, pour sont aide, il est vrai que je répond 10 jour aprés, mais vaut mieux tard que jamais !

Sinon j'avais trouver la solution tous seul, en effet j'avais une grosse m... dans mes coordonnée, et pour dire, j'en était même a accusé Delphi et qui avait un gros Bug, enfin bref, Merci !