J'ai une petite procedure (que je fais générer par une autre appli.) qui permet de dessinier une forme sur un Canvas à l'endrois désiré de la taille désiré. Et je voudrais pouvoir le faire tourner autour d'un point qui n'est pas obligatoirement le centre

Programmation sous Delphi 7

Voici le code exemple que j'utilise

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
procedure TForm1.angleChange(Sender: TObject); 
var a      : real; 
begin 
  a:=pi/180*angle.Position; 
  image1.Picture:=nil; 
  Nom_procedure(image1.Canvas,image1.width div 4,image1.Height div 4, image1.width div 10, image1.Height div 10,a); 
end; 
 
Procedure TForm1.Nom_procedure(caneva :Tcanvas; OrigineX, OrigineY, Largeur, hauteur : integer; Angle : real); 
Var rx, ry, dx, dy : real; 
    x0, y0         : integer; 
function lepoint(x, y : integer) : Tpoint; // calcul des coordonées du point après rotation 
         var R, acos   : real; 
         Begin 
           x:=trunc((x-dx)*rx)+OrigineX; 
                                        y:=trunc((y-dy)*ry)+OrigineY; 
                                        R:=sqrt(sqr(x-x0)+sqr(y-y0)); 
           acos:=arccos((x-x0) / R); 
 
           x:=X0+trunc(R*cos(acos+angle)); 
           if y>y0 then 
              y:=y0+trunc(R*sin((-1*acos)+angle)) 
                   else 
              y:=y0-trunc(R*sin(acos+angle)); 
 
           image1.Canvas.Brush.Style:=bsclear; 
           image1.Canvas.Ellipse(trunc(x0-R),trunc(y0-r),trunc(x0+r),trunc(y0+r)); 
           image1.Canvas.Brush.Style:=bssolid; 
           result:=point(x, y); 
         end; 
Begin 
  x0:=155; 
  y0:=84; 
  with caneva do 
       begin 
         rx:=1;// proportion de la forme par rapport à sa taille d'origine 
         ry:=1;// proportion de la forme par rapport à sa taille d'origine 
         Dx:=0;// coordonnées du début du traçage sur la canvas 
         Dy:=0; 
         x0:=trunc((x0-dx)*rx)+OrigineX;      // centre de rotation, coordonées recalculées 
         y0:=trunc((y0-dy)*ry)+OrigineY;      // 
//-=-=-=-=-=-=-=-=-=-=- 
         pen.Color:=clblue; 
         Polygon([lepoint(137,16),lepoint(133,119),lepoint(237,115)]); 
         pen.Color:=clred; 
         moveto(origineX,OrigineY); 
         lineto(x0,y0); 
         pen.Color:=clblack; 
         moveto(origineX,OrigineY); 
         lineto(trunc((137-dx)*rx)+OrigineX,trunc((16-dy)*ry)+OrigineY); 
         moveto(origineX,OrigineY); 
         lineto(trunc((133-dx)*rx)+OrigineX,trunc((119-dy)*ry)+OrigineY); 
         moveto(origineX,OrigineY); 
         lineto(trunc((237-dx)*rx)+OrigineX,trunc((115-dy)*ry)+OrigineY); 
       end; 
end;

Le problème est que tous les points se trouvant avec une ordonnée inférieur à l'ordonné de point de rotation sont placé symétriquement au dessus du centre de rotation et la ça me va pas.

Je suis sur que c'est une petite erreur de calcul mais je sèche.

merci de vos conseilles