刚才我好像在混乱之中把真正的问题定位错了。
今天学了半平面交,说“斜率相同的时候保留最靠左的”。包括 PPT 上差不多都是这么写的:
sort(lim.begin(),lim.end(),[](Line A,Line B) {
int qa=quadrant(A.d),qb=quadrant(B.d);
if(qa!=qb) return qa<qb;
double m=A.d*B.d;
if(abs(m)>0) return m>0;
return B.d*(A.p-B.p)>0;
});
lim.erase(unique(lim.begin(),lim.end(),[](Line A,Line B) {
return quadrant(A.d)==quadrant(B.d)&&(A.d*B.d)==0;
}),lim.end());
然后他寄了,精度误差。
尝试搞了 eps 上去,变成了:
sort(lim.begin(),lim.end(),[](Line A,Line B) {
int qa=quadrant(A.d),qb=quadrant(B.d);
if(qa!=qb) return qa<qb;
double m=A.d*B.d;
if(abs(m)>eps) return m>-eps;
return B.d*(A.p-B.p)>-eps;
});
lim.erase(unique(lim.begin(),lim.end(),[](Line A,Line B) {
return quadrant(A.d)==quadrant(B.d)&&abs(A.d*B.d)<eps;
}),lim.end());
似乎错的更多了。然后干脆把去重那一部分删掉,竟然直接过了。
目测这部分是冗余的,但是为什么加上会错??