这里的平面是(法向量)有向的
一个思路是求出两个平面的法向量,将其分别映射到 x-y 平面求一次极角, x-z 平面求一次极角;如果两个极角都相等则平面相等
(就像球极坐标系那样)
就像这样:
struct plane{
vect vec[3];
plane(){}
plane(vect uu, vect vv, vect ww){ vec[0] =uu, vec[1] =vv, vec[2] =ww; }
vect normal(){ return (vec[1]-vec[0])/(vec[2]-vec[0]);}
};
inline bool eq(plane p, plane q){
vect n1 =p.normal(), n2 =q.normal();
return (eq(atan2(n1.y, n1.x), atan2(n2.y, n2.x)) && eq(atan2(n1.z, n1.x), atan2(n2.z, n2.x)));
}
(里面的函数和结构体名就如字面意思一样...)
可貌似过不了某道题(hdu3662)
题解的判平面相等貌似都是这样的:
bool eq(plane s,plane e)//判断两个面是否为同一面
{
vect a=s.vec[0],b=s.vec[1],c=s.vec[2];
return eq(dist(a, e), 0)
&&eq(dist(b, e), 0)
&&eq(dist(c, e), 0);
}
即是否某一平面的三个点都在另一平面上;这样对于法向量相反的平面貌似也会判相等?
按原题的意思(求凸包表面数),这样应该是错误的...(不过原题也说了点集不退化成平面...)
求问第一种方式有什么问题