Einzelnen Beitrag anzeigen

DualCoreCpu
(Gast)

n/a Beiträge
 
#2

AW: Eigene Ellipsen- und Arc Funktion funktioniert nicht. Warum?

  Alt 7. Nov 2015, 20:52
Das soll noch kein Push sein, habe nur die folgenden Funktionen wie folgt geändert. Dabei funktioniert die Arc Funktion noch immer überhaupt nicht, die Ellipse wird jetzt korrekt gezeichnet, ist jedoch nicht, wie im Originaldemo weiß gefüllt, sondern schwarz, obwohl ich nur die Ellipsenfunktion getauscht habe.

Delphi-Quellcode:
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;
Die komplette Ellipse wird inzwischen korrekt gezeichnet, ist aber nicht weiß, sindern schwarz gefüllt. Wie also wird die Füllfarbe übergeben?

Warum funktioniert die Füllung im Original, aber nicht in meiner Funktion?

Ich bleibe dran!.

Geändert von DualCoreCpu ( 7. Nov 2015 um 20:56 Uhr)
  Mit Zitat antworten Zitat