Tracer un polygone regulier

cs_fadoro Messages postés 3 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 29 avril 2005 - 28 avril 2005 à 04:09
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 - 28 avril 2005 à 22:08
Bonjour alors je m'explique
Je cherche à tracer des polygones sur un paintbox avec delphi
c'est ok por les polygones quelconques grace à une liste de points, et lineto
mais je n'arrive pas à faire des polygones réguliers.J'ai pensé à faire une méthode
regulier pour l'objet polygone mais cela n'a pas l'air de fonctionner
voici le programme dans mon unité polygone :

unit Polygone;


interface
uses graphics,point,ligne,classes,math;


type
tpolygone= class
liste: tlist;
constructor create(list:tlist);
procedure affichage (canvas:tcanvas);
procedure rotation(a : real; pt0:tpoint);
procedure translation (x0,y0 : integer);
procedure regulier (O:tpoint;l:tlist;r1,r2:integer);
end;


implementation


constructor tpolygone.create(list:tlist);
begin

liste: =tlist.Create;
liste.Assign(list);
end;


procedure tpolygone.affichage(canvas:tcanvas);
var
point0,point1:tpoint;
i :integer;
begin

point0:=tpoint(liste.Items[0]);
canvas.MoveTo(point0.abs,point0.ord);
for i:=1 to liste.count-1 do
begin
point1:=tpoint(liste.Items[i]);
canvas.LineTo(point1.abs,point1.ord);
end;
canvas.lineTo(point0.abs,point0.ord);
end;


procedure tpolygone.regulier(O:tpoint;l:tlist;r1,r2:integer);
var i,x,y:integer;
ptd,pta:tpoint;

begin

r1 et r2 sont les rayons horizontal et vertical du polygone regulier

for i:=0 to l.Count-1 do
begin
ptd:=tpoint(l.Items[i]);
x:=trunc(O.abs+r1*cos(i*360div(l.Count-1)));
y:=trunc(O.ord+r2*sin(i*360div(l.Count-1)));
pta:=tpoint.create(x,y);
l.Items[i]:=pta;
end;
end;

end.


quelqu'un a t'il une solution pour m'aider?
merci

1 réponse

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 avril 2005 à 22:08
Plusieurs erreurs me semble-t-il dans ton code. Je l'ai modifié en essayant de ne pas trop cassé l'existant.

type
tpolygone=class
liste: tlist;
public
constructor create;
destructor destroy; override;


procedure affichage (canvas:tcanvas);
procedure rotation(a : real; pt0:tpoint);
procedure translation (x0,y0 : integer);
procedure regulier (O:tpoint;r1,r2,Sommets:integer);
end;


implementation


constructor tpolygone.create;
begin

inherited ;
liste:=tlist.Create;
end;


destructor tpolygone.destroy ;
begin
liste.Free ;
inherited ;
end;


procedure tpolygone.affichage(canvas:tcanvas);
var
i :integer;
begin
with canvas do
begin
MoveTo(TPoint(liste[0]).abs,TPoint(liste[0]).ord);
for i:=0 to liste.count-1 do
begin
LineTo(TPoint(liste[i]).abs,TPoint(liste[i]).ord);
end;
LineTo(TPoint(liste[0]).abs,TPoint(liste[0]).ord);
end ;
end;


procedure tpolygone.regulier(O:tpoint;r1,r2,Sommets:integer);
var i,x,y:integer;
pta:tpoint;
begin
for i:=0 to Sommets-1 do
begin
// ATTENTION cos et sin utilisent des radians !!
x:=O.abs+trunc(r1*cos((i*360.0/sommets)*(PI/180)));
y:=O.ord+trunc(r1*sin((i*360.0/sommets)*(PI/180)));
pta:=tpoint.create(x,y);
Liste.Add(pta);
end;
end;
end.

Exemple d'appel :

procedure TForm1.Button2Click(Sender: TObject);
var
O : TPoint ;
a : TPolygone ;
begin
a := TPolygone.create ;
O := TPoint.Create( PaintBox1.Width div 2, PaintBox1.Height div 2) ;
A.regulier(O,40,30,5);
A.Affichage(PaintBox1.Canvas);
a.Free ;
O.Free;
end;

Cordialement.
0
Rejoignez-nous