/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static double SegIntersection(double x11, double y11, double x12, double y12,
double x21, double y21, double x22, double y22)
{
double dx1 = x12-x11;
double dy1 = y12-y11;
double dx2 = x22-x21;
double dy2 = y22-y21;
double dxx = x11-x21;
double dyy = y11-y21;
double div, t, s;
div = dy2*dx1-dx2*dy1;
if (Math.
abs(div
) < 1.0e
-10
) //better to compare abs(div) with small Eps return 99999.0; //collinear case
t = (dx1*dyy-dy1*dxx) / div;
if (t < 0 || t > 1.0)
return 88888.8; //intersection outside the first segment
s = (dx2*dyy-dy2*dxx) / div;
if (s < 0 || s > 1.0)
return 77777.7; //intersection outside the second segment
return x11 + s * dx1;
}
{
System.
out.
println(SegIntersection
(0,
0,
1,
-1,
2,
1,
1,
2)); System.
out.
println(SegIntersection
(0,
0,
2,
0,
4,
-1,
1,
2)); System.
out.
println(SegIntersection
(0,
0,
4,
0,
2,
1,
1,
2)); System.
out.
println(SegIntersection
(0,
0,
4,
0,
4,
-1,
1,
2)); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgZG91YmxlIFNlZ0ludGVyc2VjdGlvbihkb3VibGUgeDExLCBkb3VibGUgeTExLCBkb3VibGUgeDEyLCBkb3VibGUgeTEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeDIxLCBkb3VibGUgeTIxLCBkb3VibGUgeDIyLCBkb3VibGUgeTIyKQogICAgewogICAgICAgIGRvdWJsZSBkeDEgPSB4MTIteDExOwogICAgICAgIGRvdWJsZSBkeTEgPSB5MTIteTExOwogICAgICAgIGRvdWJsZSBkeDIgPSB4MjIteDIxOwogICAgICAgIGRvdWJsZSBkeTIgPSB5MjIteTIxOwogICAgICAgIGRvdWJsZSBkeHggPSB4MTEteDIxOwogICAgICAgIGRvdWJsZSBkeXkgPSB5MTEteTIxOwogICAgICAgIGRvdWJsZSBkaXYsIHQsIHM7CgogICAgICAgIGRpdiA9IGR5MipkeDEtZHgyKmR5MTsKICAgICAgICBpZiAoTWF0aC5hYnMoZGl2KSA8IDEuMGUtMTApICAvL2JldHRlciB0byBjb21wYXJlIGFicyhkaXYpIHdpdGggc21hbGwgRXBzCiAgICAgICAgICAgcmV0dXJuIDk5OTk5LjA7ICAvL2NvbGxpbmVhciBjYXNlCgogICAgICAgIHQgPSAoZHgxKmR5eS1keTEqZHh4KSAvIGRpdjsKICAgICAgICBpZiAodCA8IDAgfHwgdCA+IDEuMCkKICAgICAgICAgICAgcmV0dXJuIDg4ODg4Ljg7IC8vaW50ZXJzZWN0aW9uIG91dHNpZGUgdGhlIGZpcnN0IHNlZ21lbnQKICAgICAgICBzID0gKGR4MipkeXktZHkyKmR4eCkgLyBkaXY7CiAgICAgICAgaWYgKHMgPCAwIHx8IHMgPiAxLjApICAKICAgICAgICAgICAgcmV0dXJuIDc3Nzc3Ljc7ICAvL2ludGVyc2VjdGlvbiBvdXRzaWRlIHRoZSBzZWNvbmQgc2VnbWVudAogICAgICAgIHJldHVybiB4MTEgKyBzICogZHgxOwogICAgfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCSAgIFN5c3RlbS5vdXQucHJpbnRsbihTZWdJbnRlcnNlY3Rpb24oMCwgMCwgMSwgLTEsIDIsIDEsIDEsIDIpKTsKCSAgIFN5c3RlbS5vdXQucHJpbnRsbihTZWdJbnRlcnNlY3Rpb24oMCwgMCwgMiwgMCwgNCwgLTEsIDEsIDIpKTsKCSAgIFN5c3RlbS5vdXQucHJpbnRsbihTZWdJbnRlcnNlY3Rpb24oMCwgMCwgNCwgMCwgMiwgMSwgMSwgMikpOwoJICAgU3lzdGVtLm91dC5wcmludGxuKFNlZ0ludGVyc2VjdGlvbigwLCAwLCA0LCAwLCA0LCAtMSwgMSwgMikpOwoJfQp9