Ich kämpfe gerade mit einer Winkelberechnungsfunktion, die mir einen Winkel zwischen 0 und 360 Grad Quadrantenrichtig berechnen soll, wobei ich davon ausghe, daß wegen des Verlaufes der X,Y Achsen mit Punkt 0,0 in der linken oberen Bildschirmecke und für beide Achsen steigenden Werten nach rechts bzw unten ich einen Koordinatenursprung festlegen muss, sagen wir in Bilschirmmitte oder bei Rechtecken in dessen Mitte, wo sich halt die Diagonalen des Rechteckes schneiden.
Der erste Quadrant liegt dann im Gegensatz zur Mathematik da, wo X > XMitte und Y > YMitte
der zweite wo X < XMitte und Y > YMitte
der dritte wo X < XMitte und Y < YMitte
der vierte wo X > XMitte und Y < YMitte
Für diese Vorgabe habe ich nun folgende Funktion geschrieben, die aber den Winkel zwischen Abszisse und einer Geraden von XMitte,YMitte zu irgendeinem Punkt X,Y noch NICHT korrekt berechnet.
- Code: Alles auswählen
function QuadrantAngle(X,Y,xm,ym: Extended): Extended;
var angle,delta: Extended;
begin
{ I. Quadrant, wegen xm < X, ym < y --> rechts unterhalb ym }
if (X > xm) and (Y > ym) then //X ist die X Koordinate, Y die Y Koordinate des Punktes,
begin //der mit xm,ym verbunden den Wikel ergeben soll
Result := arctan(Y-ym/X-xm) * pi / 180; //X,Y Koordinaten des Endpunktes
end //xm,ym Koordinaten Ursprung oder Mittelpunkt (Im Rechteck)
else //Der Winkel ist auf den Koordinatenursprung bezogen
{ II. Quadrant, wegen xm > X, ym < Y --> links unterhalb ym }
if (X < xm) and (Y > ym) then
begin
angle := arctan(Y-ym/X-xm) * pi / 180;
delta := (90 - angle) * 2;
angle := angle + delta;
Result := angle;
end
else
{ III. Quadrant, wegen xm > X, ym > Y --> links oberhalb ym }
if (X < xm) and (Y < ym) then
begin
angle := arctan(Y-ym/X-xm) * pi / 180;
delta := (90 - angle) * 2;
angle := angle + 180;
Result := angle;
end
else
{ IV. Quadrant, wegen xm < X, ym > Y --> rechts oberhalb ym }
if (X > xm) and (Y < ym) then
begin
angle := arctan(Y-ym/X-xm) * pi / 180;
delta := (90 - angle) * 2;
angle := angle + delta;
Result := angle + 180;
end;
//Result := arctan2(Y-ym,X-xm) * pi / 180;
end;
Wer kann mir weiter helfen?
Ich kann mir momentan nicht erklären, warum dieses Funktion den Winkel NULL ausgibt. Wenn ich eine Ellipsenfunktion her nehme, die Anfangs und Endwinkel als Eingabe verlangt, wird kein Ellipsenbogen gezeichnet. Jedoch wird korrekt gezeichnet, wenn ich derselben Funktion konstante Winkelwerte übergebe, der Fehler muß also in dieser Funktion hier liegen. Ich bin aber völlig ratlos bezühlich des Fehkers in dieser Funktion hier.
Weiß jemand Rat?
.
- Code: Alles auswählen