@@ -30,16 +30,16 @@ vector<P> halfPlaneIntersection(vector<Line> vs) {
30
30
vector < Line > deq (sz (vs ) + 5 );
31
31
vector < P > ans (sz (vs ) + 5 );
32
32
deq [0 ] = vs [0 ];
33
- int dh = 0 , dt = 1 , ah = 0 , at = 0 ;
34
- #define upd (l , pt , op ) while (ah < at && sideOf(sp(l), ans[pt]) < 0) op;
33
+ int ah = 0 , at = 0 ;
35
34
for (int i = 1 ; i < sz (vs ); ++ i ) {
36
35
if (angDiff (vs [i ], vs [i - 1 ]) == 0 ) continue ;
37
- upd (vs [i ], at - 1 , (at -- ,dt -- )) upd (vs [i ], ah , (ah ++ ,dh ++ ));
38
- ans [at ++ ] = lineInter (sp (deq [dt - 1 ]), sp (vs [i ])).second ;
39
- deq [dt ++ ] = vs [i ];
36
+ while (ah < at && sideOf (sp (vs [i ]),ans [at - 1 ]) < 0 ) at -- ;
37
+ while (ah < at && sideOf (sp (vs [i ]),ans [ah ]) < 0 ) ah ++ ;
38
+ ans [at ++ ] = lineInter (sp (deq [at ]), sp (vs [i ])).second ;
39
+ deq [at ] = vs [i ];
40
40
}
41
- upd ( deq [dh ], at - 1 , ( at -- , dt -- )); upd ( deq [ dt ], ah , ( ah ++ , dh ++ )) ;
42
- if ( dt - dh <= 2 ) return {} ;
43
- ans [at ++ ] = lineInter (sp (deq [dt - 1 ]), sp (deq [dh ])).second ;
41
+ while ( ah < at && sideOf ( sp ( deq [ah ]), ans [ at - 1 ]) < 0 ) at -- ;
42
+ while ( ah < at && sideOf ( sp ( deq [ at ]), ans [ ah ]) < 0 ) ah ++ ;
43
+ ans [at ++ ] = lineInter (sp (deq [ah ]), sp (deq [at ])).second ;
44
44
return {ans .begin () + ah , ans .begin () + at };
45
45
}
0 commit comments