Computational Geometry Template (三)

2014-11-23 23:18:23 · 作者: · 浏览: 15
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)))