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
|
function PolyArcOuEllipse(W, H: single; Centre: TPoint; ADegOri, ADegExt, IncliDeg: Extended): TArrayOfTPoint;
// Paramètres :
// W = largeur du Rectangle-encadrant et H = hauteur
// Centre = centre du Rectangle-encadrant
// ADegOri et ADegExt = respectivement Inclinaison des rayons qui rejoignent le point-Origine, et le point-Extrémité, de l'Ellipse ou de l'Arc-d'Ellipse
// IncliDeg := Inclinaison globale de l'Ellipse ou de l'arc d'Ellipse
// Exemple : si ADegOri = -180° et ADegExt = 0° et IncliDeg = 0° on obtient l'Arc d'Ellipse égal à la moitié supérieure de l'Ellipse
// et pour obtenir une Ellipse (ou) un Cercle entiers : ADegOri = -180° et ADegExt = +180°
var Theta, dTheta, RR, dxro, dyro, si, co, Alpha,tmp: Extended; i: integer;
begin
SetLength(Result, 0);
dTheta := Pi / 180;
if ADegOri > ADegExt then begin // ADegOri doit être inférieur à ADegExt
tmp:= ADegOri; ADegOri:= ADegExt; ADegExt:=tmp;
end;
Theta := DegToRad(ADegOri);
i := 0;
repeat
SetLength(Result, length(Result)+1);
SinCos(Theta, si, co);
dxro := W * co / 2.0;
dyro := H * si / 2.0;
RR := Hypot(dxro, dyro);
Alpha := arcTan22(dyro, dxro);
SinCos(Alpha, si, co);
Result[i].x := round(Centre.X + RR * co);
Result[i].y := round(Centre.Y + RR * si);
Theta := Theta + dTheta;
inc(i);
until Theta >= DegToRad(ADegExt);
if IncliDeg <> 0 then RotaPolygone(Result, Centre, IncliDeg);
end; |
Partager