Index: lib/geo/ccw.cpp ================================================================== --- lib/geo/ccw.cpp +++ lib/geo/ccw.cpp @@ -20,5 +20,20 @@ // intersection of two line segments. bool cross(CMP p1, CMP p2, CMP P1, CMP P2) { return ccw(p1,p2,P1)*ccw(p1,p2,P2)<=0 && ccw(P1,P2,p1)*ccw(P1,P2,p2)<=0; } + + +// Intersection of two line segments, by p1+(*pos)(p2-p1) where 0<=*pos<=1. +// only tested by local simple unittest. be careful. +template +bool cross(const std::complex& p1, const std::complex& p2, + const std::complex& P1, const std::complex& P2, T* pos) { + if( ccw(p1,p2,P1)*ccw(p1,p2,P2)<=0 && ccw(P1,P2,p1)*ccw(P1,P2,p2)<=0 ) { + if(outer_prod(p2-p1, P2-P1) == 0) + return false; // parallel + *pos = outer_prod(P1-p1, P2-P1) / outer_prod(p2-p1, P2-P1); + return true; + } + return false; +}