Schnittpunkt zwischen zwei Linien im 2D-Raum:
Linie 1:
Startpunkt (ax, ay), Richtung (bx, by)
s steht für den Abschnitt auf der Linie.
x = ax + s * bx
y = ay + s * by
Linie 2:
Startpunkt (cx, cy), Richtung (dx, dy)
t steht für den Abschnitt auf der Linie.
x = cx + t * dx
y = cy + t * dy
Gleichsetzen:
ax + s * bx = cx + t * dx
ay + s * by = cy + t * dy
Rüberbringen:
ax + s * bx - cx - t * dx = 0
ay + s * by - cy - t * dy = 0
Umformen:
s * bx + t * (-dx) = cx - ax
s * by + t * (-dy) = cy - ay
2 Gleichungen mit 2 Variablen (s und t), die wir kennen möchten! Determinante D bilden:
D =
|bx, -dx|
|by, -dy| = -bx*dy + by*dx = by*dx - bx*dy
Nun die Determinante für s (man könnte auch t nehmen, es ist egal):
Ds =
|cx - ax, -dx|
|cy - ay, -dy| = ax·dy - ay·dx - cx·dy + cy·dx
Damit können wir den Abschnitt s des Schnittpunkts berechnen:
s = Ds / D
= (ax·dy - ay·dx - cx·dy + cy·dx) / (by*dx - bx*dy)
Wenn für D null rauskommt, dürfte es keinen Schnittpunkt geben. Achtung: hier wird mit Geraden gerechnet, nicht mit Linien. Daher musst Du nachher noch prüfen, ob der gefundene Schnittpunkt an der Stelle s überhaupt in der Linie drin ist. Wenn Du als Richtungsvektoren (bx, by) bzw. (dx, dy) direkt den Verbindungsvektor zwischen den zwei Punkten, aus denen Du die Linie erstellen möchtest, angibst, dann muss s im Intervall [0; 1] liegen, ansonsten ist es außerhalb der Linie.
Die Koordinaten des Schnittpunkts sind nun:
sx = ax + s * bx
sy = ay + s * by
Oder, wenn Du t anstatt s ausrechnest:
sx = cx + t * dx
sy = cy + t * dy
Es ist egal, ob Du s oder t nimmst, es kommt derselbe Schnittpunkt raus - wenn es denn einen gibt.
Schneidet eine Linie einen Kreis?
Linie:
Startpunkt (px, py), Richtung (dx, dy)
s steht für den Abschnitt auf der Linie.
Kreis:
Mittelpunkt (mx, my), Radius r
Für alle Punkte (x, y) auf dem Kreis gilt, dass die Entfernung zum Mittelpunkt gleich dem Radius ist. Also:
(x - mx)² + (y - my)² = r²
Jetzt setzen wir für x und y die Linie ein:
((px + s * dx) - mx)² + ((py + s * dy) - my)² = r²
Löse das nach s auf... da kommt was ziemlich Langes raus
Hier findest Du was dazu: http://mathworld.wolfram.com/Circle-LineIntersection.html