Coordonnées des sommets d'un triangle équilatéral dont on connait le centre, la longueur d'un côté et l'angle du 1er sommet

Contenu du snippet

type
  TTriPoints = array[0..2] of TPoint;

const
  cDegToRad  = Pi/180;    // A(Rad) = A(Deg)*(Pi/180)
  cSqrt3div3 = sqrt(3)/3; 

// import de Math.pas , voir aide delphi "SinCos"
procedure SinCos(const Theta: Extended; var Sin, Cos: Extended);
asm
  FLD     Theta
  FSINCOS
  FSTP    tbyte ptr [edx]    // Cos
  FSTP    tbyte ptr [eax]    // Sin
  FWAIT
end;

{-- RotPt2DToPt ---------------------------------------------------
Rotation d''un Point (2 Dimensions) autour du centre de gravité d''une figure
géométrique suivant une rotation de gauche à droite (convention mathématique) :
                              2  |  1
                            _____|_____
                                 |
                              3  |  4
parametres :
  Center [I] TPoint, centre de la rotation
  Pt     [I] TPoint, coordonées du point
  Angle  [I] Single, angle de rotation en degrés
retour :
  TPoint, nouvelle coordonnées du point 
-------------------------------------------------------------------------------}
function RotPt2DToPt(const Center, Pt: TPoint; const Angle: single): TPoint;
 Var VSin,VCos,VRad : Extended;
    MPCX, MPCY : integer;
Begin
  VRad := Angle * cDegToRad;
  SinCos(VRad, VSin, VCos);
  MPCX := Pt.X - CG.X;
  MPCY := Pt.Y - CG.Y;
  Result.X := Round( MPCX * VCos + MPCY * VSin ) + CG.X;
  Result.Y := Round( MPCY * VCos - MPCX * VSin ) + CG.Y;
End;


{-- FCooPt0TRIequi2d  ------------------------------------------------------------
 Calcule les coordonnées des trois sommets d'un triangle Equilatéral en 2D
 Le premier sommet est dirigé vers la gauche horizontalement
parametres
  Center [I] TPoint, centre de la figure
  Len    [I] Integer, longeur du cotés
retour :
  TTriPoints
-------------------------------------------------------------------------------}

Function FCooPt0TRIequi2d(const Center: Tpoint; const Len: Integer): TTriPoints;
 var R : extended;
begin
  R := L * cSqrt3Div3;
  Result[0].X := Round(CG.X + R);
  Result[0].Y := CG.Y;
  Result[1].X := Round(CG.X - R / 2);
  Result[1].Y := Round(CG.Y + L / 2);
  Result[2].X := Result[1].X;
  Result[2].Y := Round(CG.Y - L / 2);
end;


// Rotation du triangle
{-- FCooPtTRIequi2d  ------------------------------------------------------------
 Calcule les coordonnées des trois sommets d'un triangle Equilatéral en 2D
 Les sommets sont décalés de Angle degrés dans le sens conventionnel
parametres :
  Center [I] TPoint, Centre de la figure 
  Len    [I] integer, Longueur d'un côté
  Angle  [I] single, angle en degrés
retour :
  TTriPoints
-------------------------------------------------------------------------------}
Function FCooPtTRIequi2d(const Center: Tpoint; const Len: Integer; 
                         const Angle: single): TTriPoints;
var TriOrg : TTriPoints;
begin
  {triangle 1ère pointe à droite horizontalement}
  TriOrg    := FCooPt0TRIequi2d(Center, Len);
  Result[0] := RotPt2DToPt(Center, TriOrg[0], Angle);
  Result[1] := RotPt2DToPt(Center, TriOrg[1], Angle);
  Result[2] := RotPt2DToPt(Center, TriOrg[2], Angle);
end;


//Exemple d'utilisation pour le tracé
{ TRIANGLE ---------------------------------------------------------------------
 parametres :
    Center     [I] TPoint, Centre de la figure
   Len        [I] integer, Longueur du côté
   PenWidth   [I] integer, Epaisseur de la ligne entourant la figure
   Angle      [I] single,  Angle de rotation dans le sens gauche à droite en degré
   Canvas     [I/O] TCanvas, Canvas désigné sur laquelle la figure sera dessinée
   PenColor   [I] TColor, Couleur du trait extérieur
   BrushColor [I] TColor, Couleur intérieure
 ------------------------------------------------------------------------------}
procedure Draw_Triangle(const Center: TPoint; const Len, aPenWidth : integer; 
                        const Angle : single; Canvas : TCanvas; 
                        const PenColor, BrushColor: Tcolor);
var NvC : TTriPoints; // coordonnées des 3 sommets
begin
  Nvc := FCooPtTRIequi2d(Center, Len, Angle);
  With Canvas do
  begin
    Pen.Color   := PenColor;
    Pen.Style   := psSolid;
    Brush.Color := BrushColor;
    Brush.Style := bsSolid;
    Pen.Width   := PenWidth;
    Polygon(NvC);
  end;
end;

Compatibilité : Delphi 5

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.