Das Problem mit deinem Sourcecode ist, dass du versucht alles in einer Procedure zu erledigen.
Du bekommst dann jede Menge Code, der zwar von dir noch einigermassen gut kommentiert ist, aber trotzdem recht schwer zu lesen ist.
Ein zentrales Problem scheint ja zu sein, festzustellen, ob ein Punkt innerhalb eines Kreises liegt oder nicht.
Dazu eine kleine Hilfsfunktion:
Delphi-Quellcode:
function PointInCircle(p, center:TPoint; radius:integer):Boolean;
begin
// SQR() = Square-Funktion = quadrieren
// Hier wird die Formel a^2 + b^2 = c^2 von Pythagoras ausgenützt
Result := SQR(p.x-center.x) + SQR(p.y-center.y) <= SQR(radius);
end;
Mit dieser Funktion kannst du an einigen Stellen eine Vereinfachung vornehmen.
Die Funktion nimmt zwei Punkte mit dem Datentyp TPoint entgegen.
Um x/y-Werte in einen TPoint umzuwandelt, gibt es die Point()-Funktion:
if PointInCircle(Point(0,0), Point(Shape1.left, Shape1.Top), 50) then ...
Wenn du herausfinden möchtest, ob ein Kreis innerhalb eines Rechtecks liegt, gibt es einen einfachen Trick:
Man prüft nicht, ob der Kreis im Rechteck liegt, sondern ob der Mittelpunkt in einem verkleinertem Rechteck liegt.
Also:
1.) Rechteck an allen 4 Seiten um den Radius verkleinern
2.) prüfen, ob Mittelpunkt innerhalb des Rechteck liegt
Dazu gibt es schon Hilfsfunktionen aus der Windows-
API.
InflateRect() vergrössert oder verkleinert ein Rechteck.
PointInRect() prüft, ob ein Punkt innerhalb eines Rechtecks liegt.