Computational Geometry Template (三)
y)+(p1.z-p2.z)*(p1.z-p2.z));
}
///三维///
//向量大小
double vlen(point3 p)
{
return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}
//判三点共线
bool dots_inline(point3 p1,point3 p2,point3 p3)
{
return vlen(xmult(subt(p1,p2),subt(p2,p3)))eps&&vlen(xmult(subt(p,s.b),subt(p,s.c)))>eps&&vlen(xmult(subt(p,s.c),subt(p,s.a)))>eps;
}
//判两点在线段同侧,点在线段上返回0,不共面无意义
bool same_side(point3 p1,point3 p2,line3 l)
{
return dmult(xmult(subt(l.a,l.b),subt(p1,l.b)),xmult(subt(l.a,l.b),subt(p2,l.b)))>eps;
}
//判两点在线段异侧,点在线段上返回0,不共面无意义
bool opposite_side(point3 p1,point3 p2,line3 l)
{
return dmult(xmult(subt(l.a,l.b),subt(p1,l.b)),xmult(subt(l.a,l.b),subt(p2,l.b)))<-eps;
}
//判两点在平面同侧,点在平面上返回0
bool same_side(point3 p1,point3 p2,plane3 s)
{
return dmult(pvec(s),subt(p1,s.a))*dmult(pvec(s),subt(p2,s.a))>eps;
}
bool same_side(point3 p1,point3 p2,point3 s1,point3 s2,point3 s3)
{
return dmult(pvec(s1,s2,s3),subt(p1,s1))*dmult(pvec(s1,s2,s3),subt(p2,s1))>eps;
}
//判两点在平面异侧,点在平面上返回0
bool opposite_side(point3 p1,point3 p2,plane3 s)
{
return dmult(pvec(s),subt(p1,s.a))*dmult(pvec(s),subt(p2,s.a))<-eps;
}
bool opposite_side(point3 p1,point3 p2,point3 s1,point3 s2,point3 s3)
{
return dmult(pvec(s1,s2,s3),subt(p1,s1))*dmult(pvec(s1,s2,s3),subt(p2,s1))<-eps;
}
//判两直线平行
bool parallel(line3 u,line3 v)
{
return vlen(xmult(subt(u.a,u.b),subt(v.a,v.b)))