Hey,
P1x und P1y bzw. P2x und P2y seien jeweils die Koordinaten der unteren linken Ecke, ich gehe von einem normalen Koordinatensystem aus, bei welchem unten links 0 ist und nach rechts und oben die Koordinaten größer werden.
Ich versuche jetzt seit einiger Zeit festzustellen, ob sich diese Rechtecke überschneiden, doch das will mir nicht gelingen. Es gibt dafür bereits die Windows Funktion RectIntersect, doch ich möchte nicht nur Ganzzahlen verwenden können, außerdem würde ich als Parameter lieber P1x, P1y, P2x, P2y, P1sizeX, P1sizeY, P2sizeX und P2sizeY übergeben, da mein gesamtes Programm bereits darauf ausgerichtet ist.
Alle Funktionen, die ich bis jetzt geschrieben haben funktionieren nicht und geben selbst bei zwei identischen Rechtecken "false" zurück:
Delphi-Quellcode:
function RectIntersectFloat(P1x, P1y, P1sizeX, P1sizeY, P2x, P2y, P2sizeX, P2sizeY: Extended):Boolean;
begin
result := true;
if (P1x >= P2x+P2sizeX) or
(P1y+P1sizeY >= P2y) or
(P2x >= P1x+P1sizeX) or
(P2y+P2sizeY >= P1y) then result:=false;
end;
Außerdem habe ich hier im Forum folgende Funktion vom ehemaligen Benutzer tommie-lie gefunden:
Delphi-Quellcode:
function RectIntersect(A, B: TRect; Offset: Integer): Boolean;
begin
result := not((A.Right + Offset <= B.Left) or
(A.Bottom + Offset <= B.Top) or
(A.Top - Offset >= B.Bottom) or
(A.Left - Offset >= B.Right));
end;
Diese habe ich einfach so umgewandelt, dass sie meinen Parametern entspricht und das Offset weggelassen (da ich dies nicht brauche), aber auch hier wird selbst bei zwei identischen Rechtecken "false" zurückgegeben:
Delphi-Quellcode:
function RectIntersectFloat(P1x, P1y, P1sizeX, P1sizeY, P2x, P2y, P2sizeX, P2sizeY: Extended):Boolean;
begin
result := not((P1x + P1sizeX <= P2x) or
(P1y <= P2y+P2sizeY) or
(P1Y + P1sizeY >= P2y) or
(P1x >= P2x+P2sizeX));
end;
Was mache ich falsch? Oder viel wichtiger: Wie wäre es richtig?
Daran, dass ich Mathematik-LK habe darf ich gerade gar nicht denken.