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;
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.