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;