@@ -18,10 +18,12 @@ typedef Point<double> P;
18
18
typedef array < P , 2 > Line ;
19
19
#define sp (a ) a[0], a[1]
20
20
#define ang (a ) atan2((a[1] - a[0]).y, (a[1] - a[0]).x)
21
-
21
+ bool cmp (Line a , Line b ) {
22
+ auto s = ang (a ) - ang (b );
23
+ return s == 0 ? sideOf (sp (b ), a [0 ]) >=0 : s < 0 ;
24
+ }
22
25
vector < P > halfPlaneIntersection (vector < Line > vs ) {
23
- sort (all (vs ), [](auto a , auto b ) { return ang (a ) < ang (b );});
24
- vs .resize (unique (all (vs ), [](auto a , auto b ){ return ang (a ) == ang (b );}) - vs .begin ());
26
+ sort (all (vs ), cmp );
25
27
vector < Line > deq (sz (vs )+ 5 );
26
28
vector < P > ans (sz (vs )+ 5 );
27
29
int dh = 0 , dt = 1 , ah = 0 , at = 0 ;
@@ -37,5 +39,7 @@ vector<P> halfPlaneIntersection(vector<Line> vs) {
37
39
while (ah < at && sideOf (sp (deq [dt ]), ans [ah ]) < 0 ) ah ++ , dh ++ ;
38
40
if (dt - dh <= 2 ) return {};
39
41
ans [at ++ ] = lineInter (sp (deq [dh ]), sp (deq [dt - 1 ])).second ;
40
- return {ans .begin ()+ ah , ans .begin ()+ at };
42
+ vector < P > res = {ans .begin ()+ ah , ans .begin ()+ at };
43
+ res .erase (unique (all (res )), res .end ());
44
+ return res ;
41
45
}
0 commit comments