Utiliser CANVAS.arc à partir d 'un centre de cercle, rayon et angle de départ et
snipersolo
Messages postés5Date d'inscriptionmardi 10 décembre 2002StatutMembreDernière intervention24 avril 2006
-
24 nov. 2005 à 00:29
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
25 nov. 2005 à 23:06
Bonjour a tous!
J'en fais appel a vous après presque 5h de recherche.
Toujours ces problèmes avec la fonction CANVAS.arc...
Je cherche à effectuer de l'importation de fichier DXF
LE FICHIER me fournit les informations suivantes :
le centre du cercle, le rayon et l angle de départ et l'angle d'arrivée
J'ai donc créer plusieurs fonctions permettant de transformer tout cela de facon à les mettre a permettre un affichage avec CANVAS.arc
Le code est un peu lourd mais il me parait fonctionner.
Hors à l'affichage rien de bien !
J'espère que quelqu'un saura trouver la petite erreur qui fait que cela ne marche pas !
procedure ClasseArc.ProcedureSetRayon(r:real);
begin
Self.Rayon := r;
end;
procedure ClasseArc.ProcedureSetAngleDepart(ang:real);
begin
Self.AngleDepart := ang;
end;
procedure ClasseArc.ProcedureSetAngleArrive(ang:real);
begin
Self.AngleArrive := ang;
end;
procedure ClasseArc.ProcedureSetCouleur(color : string);
begin
Self.Couleur := color;
end;
function ClasseArc.functionGetRayon:real;
begin
Result := Self.Rayon;
end;
function ClasseArc.functionGetCouleur:string;
begin
Result := Self.Couleur;
end;
Function ClasseArc.FunctionSetPointAngle1(Centre : Tpoint;rayon :real) : Tpoint;
// X1,Y1 de CANVAS.arc
var
PointAngle1 : Tpoint;
begin
PointAngle1.X:=Centre.X-rayon;
PointAngle1.Y:=Centre.Y-rayon;
result:=PointAngle1;
end;
Function ClasseArc.FunctionSetPointAngle2(Centre : Tpoint;rayon :real) : Tpoint;
// X2,Y2 de CANVAS.arc
var
PointAngle2 : Tpoint;
begin
PointAngle2.X:=Centre.X+rayon;
PointAngle2.Y:=Centre.Y+rayon;
result:=PointAngle2;
end;
Function ClasseArc.FunctionTransformeAnglePoint(Centre : Tpoint;rayon,angleParam :real):Tpoint;
// Cette fonction va permettre de transformer mes angles dep et arrivee en points pour formater le tout
// au format canvas.arc => parmettre X3,Y3,X4,Y4
var
PointGenere : Tpoint;
angle : real;
begin
angle := DegToRad(angleParam);
if angle=0 then
begin
PointGenere .X:=Centre.X+rayon;
PointGenere .Y:=Centre.Y;
end
else
begin
if (angle>0) and (angle<(Pi/2)) then
begin
PointGenere.X:=Centre.X+abs(cos(angle))*rayon;
PointGenere.Y:=Centre.Y-abs(sin(angle))*rayon;
end
else
begin
if angle=Pi/2 then
begin
PointGenere.X:=Centre.X;
PointGenere.Y:=Centre.Y-rayon;
end
else
begin
if (angle>(Pi/2)) and (angle(Pi)) and (angle<(3*Pi/2)) then
begin
PointGenere.X:=Centre.X-abs(cos(angle-Pi))*rayon;
PointGenere.Y:=Centre.Y+abs(sin(angle-Pi))*rayon;
end
else
begin
if angle = (3*Pi/2) then
begin
PointGenere.X:=Centre.X;
PointGenere.Y:=Centre.Y+rayon;
end
else
begin
if (angle>(3*Pi/2)) and (angle<(2*Pi)) then
begin
PointGenere.X:=Centre.X+abs(cos(2*Pi-angle))*rayon;
PointGenere.Y:=Centre.Y+abs(sin(2*Pi-angle))*rayon;
end
end;
end;
end;
end;
end;
end;
end;
result := PointGenere;
end;
procedure ClasseArc.ProcedureDessineToi(image1:timage;header:ClasseHeader);
var
//Angle haut Gauche
X : Tpoint;
//Angle bas droite
Y : Tpoint;
//Point de depart de l arc sur le cercle
AngleDep : Tpoint;
//Point d'arrivee de l arc sur le cercle
AngleArr : Tpoint;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 25 nov. 2005 à 23:02
oula... ça c'est de la mise en forme ...
bon alors ...
deja pour TPoint, c'est un type existant dans delphi, donc renomage en TRealPoint
pour le noms de tes variables pareil, Abs et Ord sont des noms de fonction donc ... eviter de les utiliser donc...
ensuite pour les variables en private prefere la creation de property plutot que des GetMachin a tout vas...
dans published tu mets simplement :
published
property Identificateur : type read VariablePrivate write VariablePrivate ou Methode;
exemple dans ton cas :
private
pvRayon : single;
pvAngleDepart : single;
pvColor : single;
published
property Rayon : single Read pvRayon Write pvRayon;
property Color : string Read pvColor Write pvColor;
property AngleDepart : single Read pvAngleDepart Write pvAngleDepart;
end;
etc...
- inutile de travailler en Real (10 octets), Single (4 octets) serat bien suffisant pour ce genre de chose.
- evite les cascade de IF ELSE ... c'est lourd et pas trés lisible mais ça tu as surrement du le remarquer...
- pour les retours de fonction, pas la peine de créer une variable exprée ... tu peut ecrire directement dans Result
- pour les noms de tes procedures ou fonction, fait cours ... mettre
FunctionBlablabla ça sert a rien et surtout ça facilite en rien leur
utilisation ni les retenir...
et dernier conseil pratique, dans la declaration des tes variables, dans tes procedures ou fonctions ou autre,
tu peux "grouper" les variables de meme types donc :
plutot que :
X : TPoint;
Y : TPoint;
ect...
fait :
X,Y : TPoint;
ce seras plus rapide et moins lourd.
sinon j'ai optimiser rapidement ta fonction FunctionTransformationAnglePoint (que tu pourrais appeler AngleToRealPoint)