Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

POINTS DE DIFFÉRENTS DIAMÈTRES ET COULEURS AVEC LA MÉTHODE ELLIPSE DE TCANVAS


Information sur la source

Catégorie :Graphique Classé sous : points, diamètre, canvas, ellipse, dynamique Niveau : Débutant Date de création : 01/05/2005 Vu / téléchargé: 3 152 / 209

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Tracer un point de diamètre 1 à 255 sur un Canvas : utilisation de la méthode Ellipse de TCanvas qui dessine une ellipse circonscrite dans un rectangle.
Ici l'ellipse est circulaire puisque circonscrite dans un carré.
Les propriétés Pen et Brush sont de couleur identique.
Il s'agit ensuite de déterminer le diamètre ("épaisseur") de ce point.
On obtient donc bien la représentation graphique d'un point.

En réponse à une question posée ici :

http://www.delphifr.com/forum.v2.aspx?ID=446412&nb=4

j'ai fait quelques essais qui ont donné ce code.

Je le poste afin d'en faire profiter le plus grand nombre.

Je ne l'ai pas encore commenté, je le ferai plus tard.
Mais je pense qu'il est assez élémentaire et facile à comprendre, même pour un débutant.

Quelques précisions néanmoins :

J'ai utilisé un type Record (APoint = record) pour stocker les informations relatives au point qui vient d'être dessiné.

Ce Record est ensuite lui-même stocké dans un tableau dynamique de Record (TTabPoints: array of APoint). Sa longueur sera augmentée à chaque ajout de données.

Cela nous servira pour redessiner les points à chaque évènement OnRepaint du Canvas. Sinon nos points ne seraient pas redessinés au réaffichage de notre Form.
Pour le vérifier, il suffit de supprimer le code dans cette procédure, et de minimiser ou de masquer (en partie ou totalement) notre Form... ;-)

D'ailleurs, la réinitialisation de ce Tableau dynamique à 0, suivie d'un Refresh, provoque l'effacement de tous les points.

Voilà.
Ce ne sont pas là des choses bien compliquées, mais je pense que ça peut être utile.

Bonne prog' à tou(te)s :-p

Code ci-dessous pour ceux qui ne veulent pas télécharger le zip.
 

Source

  • unit Unit1;
  • interface
  • uses
  • Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  • ExtCtrls, StdCtrls, Spin;
  • type
  • TForm1 = class(TForm)
  • Panel1: TPanel;
  • btnClear: TButton;
  • GroupBox1: TGroupBox;
  • seWidth: TSpinEdit;
  • btnColorDialog: TButton;
  • ColorDialog: TColorDialog;
  • Label1: TLabel;
  • Label2: TLabel;
  • pnlNumPoints: TPanel;
  • procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  • Shift: TShiftState; X, Y: Integer);
  • procedure FormCreate(Sender: TObject);
  • procedure FormPaint(Sender: TObject);
  • procedure btnClearClick(Sender: TObject);
  • procedure btnColorDialogClick(Sender: TObject);
  • end;
  • type
  • APoint = record
  • Cnvs: TCanvas;
  • X, Y: Word;
  • D: Byte;
  • Col: TColor;
  • end;
  • var
  • Form1: TForm1;
  • TTabPoints: array of APoint;
  • LongTab: Word;
  • CurrentColor: TColor;
  • implementation
  • {$R *.DFM}
  • procedure InitialiseTTabPoints;
  • begin
  • with TForm1 do
  • begin
  • SetLength(TTabPoints, 0);
  • LongTab := 0;
  • end;
  • end;
  • procedure StockeTTabPoints(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor);
  • begin
  • with TForm1 do
  • begin
  • Inc(LongTab);
  • SetLength(TTabPoints, LongTab);
  • TTabPoints[LongTab -1].Cnvs := Cnvs;
  • TTabPoints[LongTab -1].X := X;
  • TTabPoints[LongTab -1].Y := Y;
  • TTabPoints[LongTab -1].D := D;
  • TTabPoints[LongTab -1].Col := Col;
  • end;
  • end;
  • procedure DessinePoint(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor;
  • const Add: Bool = False);
  • var R: Byte;
  • begin
  • if D < 1 then Exit;
  • if D > 1 then
  • begin
  • R := D div 2;
  • Cnvs.Pen.Color := Col;
  • Cnvs.Brush.Color := Col;
  • Cnvs.Ellipse(X - R, Y - R, X - R + D, Y - R + D);
  • end
  • else
  • Cnvs.Pixels[X, Y] := Col;
  • if Add then
  • StockeTTabPoints(Cnvs, X, Y, D, Col);
  • end;
  • procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  • Shift: TShiftState; X, Y: Integer);
  • var E: Byte;
  • begin
  • E := seWidth.Value;
  • DessinePoint(Canvas, X, Y, E, CurrentColor, True);
  • pnlNumPoints.Caption := IntToStr(LongTab);
  • end;
  • procedure TForm1.FormCreate(Sender: TObject);
  • begin
  • InitialiseTTabPoints;
  • end;
  • procedure TForm1.FormPaint(Sender: TObject);
  • var i: Integer;
  • begin
  • for i := 0 to LongTab -1 do
  • with TTabPoints[i] do
  • DessinePoint(Cnvs, X, Y, D, Col, False);
  • end;
  • procedure TForm1.btnClearClick(Sender: TObject);
  • begin
  • InitialiseTTabPoints;
  • pnlNumPoints.Caption := IntToStr(LongTab);
  • Refresh;
  • end;
  • procedure TForm1.btnColorDialogClick(Sender: TObject);
  • begin
  • if ColorDialog.Execute then
  • begin
  • CurrentColor := ColorDialog.Color;
  • ColorDialog.Color := CurrentColor;
  • end;
  • end;
  • end.
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Spin;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    btnClear: TButton;
    GroupBox1: TGroupBox;
    seWidth: TSpinEdit;
    btnColorDialog: TButton;
    ColorDialog: TColorDialog;
    Label1: TLabel;
    Label2: TLabel;
    pnlNumPoints: TPanel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure btnColorDialogClick(Sender: TObject);
  end;

type
  APoint = record
    Cnvs: TCanvas;
    X, Y: Word;
    D: Byte;
    Col: TColor;
  end;

var
  Form1: TForm1;
  TTabPoints: array of APoint;
  LongTab: Word;
  CurrentColor: TColor;

implementation

{$R *.DFM}

procedure InitialiseTTabPoints;
begin
  with TForm1 do
  begin
    SetLength(TTabPoints, 0);
    LongTab := 0;
  end;
end;

procedure StockeTTabPoints(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor);
begin
  with TForm1 do
  begin
    Inc(LongTab);
    SetLength(TTabPoints, LongTab);
    TTabPoints[LongTab -1].Cnvs := Cnvs;
    TTabPoints[LongTab -1].X := X;
    TTabPoints[LongTab -1].Y := Y;
    TTabPoints[LongTab -1].D := D;
    TTabPoints[LongTab -1].Col := Col;
  end;
end;

procedure DessinePoint(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor;
  const Add: Bool = False);
var R: Byte;
begin
  if D < 1 then Exit;
  if D > 1 then
  begin
    R := D div 2;
    Cnvs.Pen.Color := Col;
    Cnvs.Brush.Color := Col;
    Cnvs.Ellipse(X - R, Y - R, X - R + D, Y - R + D);
  end
  else
    Cnvs.Pixels[X, Y] := Col;
  if Add then
    StockeTTabPoints(Cnvs, X, Y, D, Col);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var E: Byte;
begin
  E := seWidth.Value;
  DessinePoint(Canvas, X, Y, E, CurrentColor, True);
  pnlNumPoints.Caption := IntToStr(LongTab);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitialiseTTabPoints;
end;

procedure TForm1.FormPaint(Sender: TObject);
var i: Integer;
begin
  for i := 0 to LongTab -1 do
    with TTabPoints[i] do
      DessinePoint(Cnvs, X, Y, D, Col, False);
end;

procedure TForm1.btnClearClick(Sender: TObject);
begin
  InitialiseTTabPoints;
  pnlNumPoints.Caption := IntToStr(LongTab);
  Refresh;
end;

procedure TForm1.btnColorDialogClick(Sender: TObject);
begin
  if ColorDialog.Execute then
  begin
    CurrentColor := ColorDialog.Color;
    ColorDialog.Color := CurrentColor;
  end;
end;

end.

Conclusion

Compilable à partir de D4, avant je ne pense pas à cause du tableau dynamique :-(
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de japee le 01/05/2005 18:15:30 administrateur CS

Et merci à Kenavo sans qui j'aurais négligé les chiffres impairs pour le diamètre des points.

Car pourquoi, en effet ?

Je pense que j'étais motivé par d'obscures considérations, tenant plus de l'ostracisme le plus perverti que d'arguments réellement défendables.

J'en demande pardon aux jurés ainsi qu'aux familles des victimes...

(Pardon pour ce délire :-p)

signaler à un administrateur
Commentaire de ni69 le 01/05/2005 19:17:36

Objectif parfaitement rempli japee ;)
Bravo !

signaler à un administrateur
Commentaire de japee le 01/05/2005 21:52:48 administrateur CS

Merci, ni69  :-)

signaler à un administrateur
Commentaire de Kenavo le 01/05/2005 21:59:35

Si j'ai pu t'éviter un impair ..... :-))

signaler à un administrateur
Commentaire de japee le 01/05/2005 22:03:58 administrateur CS

Oui, Kenavo, lol ;)

Mais bon, la "pairfection" n'étant pas de ce monde...

signaler à un administrateur
Commentaire de ManChesTer le 03/05/2005 21:36:08 administrateur CS

Pas mal japee, cependant,

j'aurais plutot ecrit :

procedure StockeTTabPoints(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor);
begin
  with TForm1 do
  begin
    SetLength(TTabPoints, Succ(LongTab));
    TTabPoints[LongTab].Cnvs := Cnvs;
    TTabPoints[LongTab].X := X;
    TTabPoints[LongTab].Y := Y;
    TTabPoints[LongTab].D := D;
    TTabPoints[LongTab].Col := Col;
    Inc(LongTab);
  end;
end;

procedure DessinePoint(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor;
  const Add: Bool = False);
var R: Byte;
begin
  if D < 1 then Exit;
  with cnvs do
  begin
   R := D shr 1;
   Pen.Color := Col;
   Brush.Color := Col;
   Dec(X,R);
   Dec(Y,R);
   Ellipse(X, Y, X + D, Y + D);
  end;
  if Add then
    StockeTTabPoints(Cnvs, X, Y, D, Col);
end;

Mais c'est du chipotage, lol

Bon Coding....

ManChesTer.

signaler à un administrateur
Commentaire de japee le 03/05/2005 22:16:36 administrateur CS

Merci pour ton appréciation, Manchester.

J'aimes bien quand tu chipotes, ça m'apprend toujours quelque chose ;)

Bon coding à toi...

japee

signaler à un administrateur
Commentaire de ManChesTer le 03/05/2005 23:23:44 administrateur CS

Note aussi que

procedure StockeTTabPoints(Cnvs: TCanvas; X, Y: Word; D: Byte; Col: TColor);
begin
  with TForm1 do <== sert a rien....
  begin
    SetLength(TTabPoints, Succ(LongTab));
    TTabPoints[LongTab].Cnvs := Cnvs;
    TTabPoints[LongTab].X := X;
    TTabPoints[LongTab].Y := Y;
    TTabPoints[LongTab].D := D;
    TTabPoints[LongTab].Col := Col;
    Inc(LongTab);
  end;
end;

Mais c'est toujours du chipotage.

Bon Coding....

ManChesTer.

signaler à un administrateur
Commentaire de japee le 04/05/2005 01:44:29 administrateur CS

Exact !

De même, maintenant que tu as attiré mon attention dessus, pareil ici :

procedure InitialiseTTabPoints;
begin
  with TForm1 do // <- inutile !
  begin
    SetLength(TTabPoints, 0);
    LongTab := 0;
  end;
end;

Honte à moi, mais bon, j'ai bossé un peu vite sur ce code.

J'essaierai dorénavant à l'avenir de ne plus recommencer...

Sniff...

Si tu continues à chipoter comme ça, je vais être obligé de tout refaire morceau par morceau, lol    :-p

Bon coding à toi...

japee

signaler à un administrateur
Commentaire de ManChesTer le 04/05/2005 11:43:00 administrateur CS

Japee,

Rassure-toi, je me suis douté que c'etais de l'inatention, ca nous arrive à tous, surtout quand on bosse trops, il n'y a pas de honte à ca.

Une bonne astuce pour eviter se genre de probleme est de relire le code à tete reposée, ca permet souvent de trouvé des erreurs idiotes ou des oublis, c'est normal ....

Encore un chipo (pour le fun) :

procedure StockeTTabPoints(Canvas: TCanvas; PX, PY: Word; Diam: Byte; Color: TColor);
begin
SetLength(TTabPoints, Succ(LongTab));
with TTabPoints[LongTab] do
begin
  Cnvs := Canvas;
  X    := PX;
  Y    := PY;
  D    := Diam;
  Col  := Color;
end;
Inc(LongTab);
end;

Bon Coding...

ManChesTer.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Canvas.ellipse(Trect), résultat bizarre ? [ par DeltaFX ] Vala mon probl&#232;me du jour :j'ai un Trect, une form et son canvas, et l'envie de dessiner un cercle. Donc pouf, mon trect, j'en fais un carr&#233; Points d'accroche d'un arc de cercle (canvas.arc) [ par orelien ] Bonjour, J'utilise la fonction canvas.arc pour dessiner une partie de cercle, et j'aimarais conna&#238;tre les points de d&#233;but et de fin de cet a glscene : besoin d'aide. [ par denis42160 ] bonjour,j'ai besoin d'aide sur le fonctionnement de glscene.j'ai des problemes pour creer des objets sans passer par l'interface graphique.car j'aurai Dynamique vs. statique ? [ par DeltaFX ] Ah ben tenez, j'ai une question soudain, est ce que fait une big diff&#233;rence en occupation memoire / temps cpu de cr&#233;er dynamiquement un comp requete SQL "dynamique" [ par xelah ] Bonjour, Je vais vous expliquer mon problème. Un exemple fictif: Dans une Form, il y a un combobox relié à une base A (avec comme champ Clio, Laguna sorte de typage dynamique [ par maxpiton4D ] Bonjour &#224; tous,Comment pourrais-je faire choisir &#224; celui qui utilise ma librairie le type de variable que retournera une fonction?exemple : effacer polyline [ par seba31stien ] Bonjour, dans mon appli, je trace des lignes entre deux points sur un paintbox (&#233;quip&#233; d'une carte g&#233;o) selon : PaintBox1.Canvas.Poly " Strecher " un canvas imprimante vers un canvas écran [ par Tank01 ] Bonjour,Je code un programme contenant un canvas écran ( vide pour le moment),puis  un canvas imprimante avec des textes sur ce canvas ( TPrinter). Je Pb Canvas.Draw [ par MathU Zalem ] Salut à tous,J'ai un pb probablement simple, mais je ne trouve pas la réponse. Dans le cadre d'un petit projet (editeur d'icône), j'ai voulu afficher Petit problème avec Form.Canvas.Pixels... [ par Squallou ] Hello tout le monde. J'ai une question toute bête. J'ai voulu faire un Form.Canvas.Pixels dans mon OnMouseMove de ma Form mais je me suis aperçu que


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.