关于半平面交的写法。
查看原帖
关于半平面交的写法。
120947
PurslaneM2GA楼主2024/5/30 21:42

刚才我好像在混乱之中把真正的问题定位错了。

今天学了半平面交,说“斜率相同的时候保留最靠左的”。包括 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());

似乎错的更多了。然后干脆把去重那一部分删掉,竟然直接过了。

目测这部分是冗余的,但是为什么加上会错??

2024/5/30 21:42
加载中...