Man kann durch die Begrenzung nur noch auf eine Weise was raus holen, die allerdings ist wenn man seeeehr viel schneiden muss echt gut: Bounding-Box Intersektion.
Die Bounding-Box ist ein die Strecke genau einfassendes Rechteck, was bei Strecken super einfach zu erledigen ist, da ein (zum Koordinatensystem orthogonales) Rechteck durch eben zwei Punkte genau definiert ist.
Sei Strecke 1 gegeben durch P1A, P1B und Strecke 2 durch P2A, P2B. Du musst nun prüfen ob ein Punkt P2* in dem Rechteck P1A, P1B liegt, was folgender Bedingung entspricht:
MinX = min(P1A.x, P1B.x)
MinY = min(P1A.y, P1B.y)
MaxX = max(P1A.x, P1B.x)
MaxY = max(P1A.y, P1B.y)
(P2*.x >= MinX) and (P2*.x <= MaxX) and (P2*.y >= MinY) and (P2*.y <= MaxY)
Wenn dieser Term für mindestens einen der beiden Punkte der Strecke 2 true ist, könnten die Strecken sich schneiden, ansonsten auf keinen Fall. Im Fall "true" muss man dann eben genauer nachsehen, auf genau die Weise wie du es schon tust. Das wäre also eine vorgeschaltete Prüfung, die schon mal grob guckt ob es sich lohnt zu rechnen.
Man handelt sich damit zwar ein paar Vergleiche mehr ein, die sind aber im Vergleich zur Fließkommaarithmetik bei der genauen Berechnung extrem fix erledigt. Das heisst es lohnt sich insbesondere dann, wenn es um recht viele, vor allem kurze Strecken geht, wo die Wahrscheinlichkeit dass sich zwei schneiden recht gering ausfällt.
Und wenn man es dann noch weiter spinnt - aber das lohnt nun wirklich erst ab ein paar hundert tausend Strecken - ist der Einsatz eines
Octrees. Das ist aber schon ganz erheblicher Overhead, auch in der Implementierung, der z.B. in 3D oft und gern in Spielen eingesetzt wird um Kollisionserkennung (die ja letztlich nichts weiter als Schnittoperationen ist) effizient zu halten, und ein bewegtes Objekt wirklich nur mit nahen grob in Frage kommenden anderen tatsächlich ganz ausrechnen zu müssen.
Was dein Problem mit der Division durch 0 angeht: Rechne den Term unter dem Bruchstrich als erstes aus. Wenn der 0 ist, tausche die Strecken gegeneinander aus. Das sollte schon genügen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)