Envoyé par
Péhelji
... Voici son adaptation sous Lazarus :
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
|
procedure TFiche.TrackBar_AngleChange(Sender: TObject);
const
Np = 4;
Pis180 = Pi / 180;
type
Tab = array[1..Np] of single;
var
u, v, x, y: Tab;
Ar, Ca, Sa: single;
Dx, Dy, Xc, Yc: single;
i: byte;
begin
// Centre de la fiche en (219,190)
Xc := Fiche.Width / 2;
Yc := Fiche.Height / 2;
// Initialisation des positions de départ (x, y)
x[1] := cbBlack.Left; x[2] := cbRed.Left; x[3] := cbYellow.Left; x[4] := cbBlue.Left;
y[1] := cbBlack.Top; y[2] := cbRed.Top; y[3] := cbYellow.Top; y[4] := cbBlue.Top;
// Passage des degrés aux radians
Ar := TrackBar_Angle.Position * Pis180;
// Calcul des fonctions trigonométriques
Ca:= cos(Ar);
Sa:= sin(Ar);
// On calcul la distance qui separe ton point du centre
for i := 1 to Np do
begin
Dx:= x[i] - Xc;
Dy:= y[i] - Yc;
u[i]:= Xc + (Dx * Ca) - (Dy * Sa);
v[i]:= Yc + (Dx * Sa) + (Dy * Ca);
end;
... / ... |
Toutefois les angles se doivent d'être calculés en radians pour que l'algorithme fonctionne.
Pour atteindre le même résultat avec des degrés, où faudrait-il placer le facteur de conversion Pis180 ?
Je ne comprends pas ta question: l'instruction de conversion
Ar := TrackBar_Angle.Position * Pis180;
est correctement placée, à la ligne (22), avant l'appel des fonctions trigonométriques (lignes 25 et 26) qui n'utilisent à ma connaissance que des angles exprimés en radians.
Peut-être existe-t-il sous Lazarus des variantes admettant en argument des angles en degré ? Je ne pense pas cependant que l'exécution soit plus rapide.
# Une remarque, par ailleurs:
Il existe une fonction de conversion des angles:
function RadToDeg(Radians: Extended): Extended; { Degrees := Radians * 180 / PI }
ainsi qu'une procédure d'obtention simultanée du sinus et du cosinus:
procedure SinCos(Theta: Extended; var Sin, Cos: Extended);
cette dernière permettant un calcul deux fois plus rapide des deux termes.
Ce qui est écrit aux lignes 22 ~ 26 pourrait ainsi être remplacé (sauf erreur) par:
1 2
| Ar := RadToDeg(TrackBar_Angle.Position);
SinCos(Ar, Sa, Ca); |
ou d'une façon encore plus brève (quoique je m'abstienne généralement de l'emboîtement des fonctions):
SinCos(RadToDeg(TrackBar_Angle.Position), Sa, Ca);
# Tu n'es heureusement pas du tout aussi nul que ta déclaration initiale l'avait laissé croire
Est-il besoin de vous préciser que j'ai toujours été nul en maths et que la trigonométrie et moi çà fait deux ?
et qui décourageait franchement toute tentative de réponse.
Partager