bool intersect(GeoPoint a, GeoPoint b, GeoPoint c, GeoPoint d) { if (!intersect_1d(a.x, b.x, c.x, d.x) || !intersect_1d(a.y, b.y, c.y, d.y)) { return(false); } line m = new line(a, b); line n = new line(c, d); double zn = det(m.a, m.b, n.a, n.b); if (Math.Abs(zn) < GeoPoint.EPS) { return(!(Math.Abs(m.dist(c)) > GeoPoint.EPS || Math.Abs(n.dist(a)) > GeoPoint.EPS)); } else { double xx = -det(m.c, m.b, n.c, n.b) / zn; double yy = -det(m.a, m.c, n.a, n.c) / zn; return(betw(a.x, b.x, xx) && betw(a.y, b.y, yy) && betw(c.x, d.x, xx) && betw(c.y, d.y, yy)); } }