Naja, bei einer senkrechten Gerade/Strecke ist der Fall doch trivial.
Es sei eine Strecke/Gerade [P1P2]/P1P2 gegeben durch die Punkte P1(x1|y1), P2(x2,y2) und ein Kreis k(M,r) mit dem Mittelpunkt M(xm,ym). Es gelte x1=x2.
Delphi-Quellcode:
dx := x1-xm;
disc := r*r-dx*dx;
if disc > 0 then
begin
setlength(result, 2);
result[0].X := x1;
result[0].Y := ym + sqrt(disc);
result[1].X := x1;
result[2].Y := ym - sqrt(disc);
end
else if disc = 0 then
begin
setlength(result, 1);
result[0].X := x1;
result[0].Y := ym;
end;
Die Schnittpunkte werden in result zurückgegeben.
(Bei einer Strecke muss man noch überprüfen, ob die gefundenen Schnittpunkte auch wirklich zwischen P1 und P2 liegen, da reicht die Überprüfung ((resultY <= y1) and (resultY >=y2)) or ((resultY >= <1) and (resultY <= y2)) )
Ich habe bisher alle Probleme dieser Art (z.B. Billardsimulation, Dreiecksaufgabe beim BWINF) so gelöst (Betrachtung als Funktion für x1!=x2, ansonsten Sonderfallbehandlung als senkrechte Gerade) und es funktioniert prima.