<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% Bestimmung eines Schnittpunkts des Kreises um Mittelpunkt (U,V) mit Radius R
% mit der Geraden durch Punkte (X1,Y1) und (X2,Y2):
% Sei DX:=X2-X1 und DY:=Y2-Y1.
% Parameterdarstellung der Geraden: X=X1+DX*T und Y=Y1+DY*T.
% Sei EX:=X1-U und EY:=Y1-V.
% Gleichung des Kreises: (X-U)**2+(Y-V)**2=R**2, also fuer obige X und Y:
% (DX*T+EX)**2+(DY*T+EY)**2=R**2. Fuer Schnittpunkt also A*T**2+B*T+C=0, wobei
% A:=DX**2+DY**2, B:=2*(DX*EX+DY*EY) und C:=EX**2+EY**2-R**2.
% Loesung der quadratischen Gleichung: Diskriminante D:=B**2-4*A*C.
% D muss groessergleich 0 sein. Dann sei W:=sqrt(D).
% Dann ist T = (-B+PMW)/(2*A) mit PMW gleich plusminus W.
% Fuer einen Schnittpunkt (X,Y) gilt X=X1+DX*T und Y=Y1+DY*T.

kreis_gerade_schnittpunkt(kreis(punkt(U,V),R),
			  gerade(punkt(X1,Y1),punkt(X2,Y2)),
			  punkt(X,Y)):-
    DX is X2-X1,
    DY is Y2-Y1,
    EX is X1-U,
    EY is Y1-V,
    A is DX**2+DY**2,
    B is 2*(DX*EX+DY*EY),
    C is EX**2+EY**2-R**2,
    D is B**2-4*A*C,
    D &gt;= 0,
    W is sqrt(D),
    plusminus(W,PMW),
    T is (-B+PMW)/(2*A),
    X is X1+DX*T,
    Y is Y1+DY*T.
    
plusminus(W,0):- W=:=0.
plusminus(W,W):- W&gt;0.
plusminus(W,-W):- W&gt;0.

% ?- kreis_gerade_schnittpunkt(kreis(punkt(3,1),2), gerade(punkt(1,3),punkt(6,1)),P).
</pre></body></html>