function Arc(
dc: HDC; Left, Top, Right, Bottom, xStart, yStart, xEnd, yEnd: Integer): BOOL;
var xm, ym, a,b, startgd, endgrad: Integer;
//Hier eine Funktion zur Winkelberechnung aus den x,y Koordinaten von Start und Ende des Bogens
function _angle(xS,yS,x,y: Integer): Integer;
begin
if (xS<x)
and (yS<y)
then
begin
startgd := Round(arctan2(-xS, -yS));
delta := Round(arctan2(-yS, -xS));
startgd := startgd + delta * 2;
Result := startgd;
end else
if (xS<x)
and (yS>y)
then
begin
startgd := Round(arctan2(yS, -xS));
delta := Round(arctan2(-xS, yS));
startgd := startgd + round(2*pi);
Result := startgd;
end else
if (xS>x)
and (yS>y)
then
begin
startgd := Round(arctan2(xS, yS));
delta := Round(arctan2(yS, xS));
startgd := startgd + delta*2 + round(2*pi);
Result := startgd;
end;
end;
begin
xm := Left + Abs(Right - Left)
div 2;
ym := Top + Abs(Bottom - Top)
div 2;
a := Right - xm;
b := Bottom - ym;
//startgd := Round(arctan2(xStart, yStart));
//endgrad := Round(arctan2(xEnd, yEnd));
//Hier will ich die korrekten Winkel berechnen. Laut MSDN nimmt die Arc() Funktion keinerlei
//Korrekturen der Koordinaten vor, die müssen also vorher berechnet werden. Meine
//Ellipsenfunktionen setzen aber auf Start- und Endwinkel. Diese will ich mit arctan()
//berechnen, xStart,yStart,xEnd,yEnd werden ja übergeben und wenn die Strahlen passend
//verlängert werden, schneiden sie auch einen Kreis mit gleichem Mittelpunkt.
//Oben habe ich eine Unterfunktion, die mir den Winkel ebenso berechnet und die ich statt der
//Winkelwerte in meine EllipseSeg Funktion eingesetzt habe.
if (xStart<xm)
and (yStart<ym)
then
begin
startgd := Round(arctan2(-xStart, -yStart));
delta := Round(arctan2(-yStart, -xStart));
startgd := startgd + delta * 2;
end else
if (xStart<xm)
and (yStart>ym)
then
begin
startgd := Round(arctan2(yStart, -xStart));
delta := Round(arctan2(-xStart, yStart));
startgd := startgd + round(2*pi);
end else
if (xStart>xm)
and (yStart>ym)
then
begin
startgd := Round(arctan2(xStart, yStart));
delta := Round(arctan2(yStart, xStart));
startgd := startgd + delta*2 + round(2*pi);
end;
case _theArcDirection_
of
AD_COUNTERCLOCKWISE:
begin
DrawEllipseSeg(
dc, xm, ym, _angle(xStart,yStart,xm,ym), _angle(xEnd,yEnd,xm,ym), a, b, GetDCPenColor(
dc));
end;
AD_CLOCKWISE:
begin
//So hatte ich die Winkelwerte vorher eingesetzt, jetzt aber wie oben
//bei AD_COUNTERCLOCKWISE
DrawEllipseSeg(
dc, xm, ym, endgrad, startgd, a, b, GetDCPenColor(
dc));
end;
end;
end;
function Pie(
dc: HDC; Left, Top, Right, Bottom, xStart, yStart, xEnd, yEnd: Integer): BOOL;
var xm, ym, a,b: Integer;
begin
xm := Left + Abs(Right - Left)
div 2;
ym := Top + Abs(Bottom - Top)
div 2;
a := Right - xm;
b := Bottom - ym;
SetArcDirection(
dc, AD_COUNTERCLOCKWISE);
if Arc(
dc, Left, Top, Right, Bottom, xStart, yStart, xEnd, YEnd)
then
begin
MoveToEx(
dc, xStart, xStart,
nil);
LineTo(
dc, xm, ym);
MoveToEx(
dc, xEnd, yEnd,
nil);
LineTo(
dc, xm, ym);
end
end;
function Ellipse(
dc: HDC; left,Top,Right,Bottom: Integer): BOOL;
var xm, ym, a,b: Integer;
begin
xm := Left + Abs(Right - Left)
div 2;
ym := Top + Abs(Bottom - Top)
div 2;
a := Right - xm;
b := Bottom - ym;
DrawEllipseL(
dc, xm, ym, a-1, b-1, GetDCPenColor(
dc));
//Begrenzungslinie
DrawEllipseF(
dc, xm, ym, a-1, b-1, GetDCBrushColor(
dc));
//Füllung
end;