//判定线段与空间三角形相交,包括交于边界和(部分)包含 int seg_triangle_inter(const Line &l, const Plane &s) { return !same_side(l.a, l.b, s) && !same_side(s.a, s.b, Plane(l.a, l.b, s.c)) && !same_side(s.b, s.c, Plane(l.a, l.b, s.a)) && !same_side(s.c, s.a, Plane(l.a, l.b, s.b)); }
inline bool point_in_triangle(glm::vec3 p, glm::vec3 a, glm::vec3 b, glm::vec3 c) { //Implemented using as reference: http://www.blackpawn.com/texts/pointinpoly/ bool test; test = same_side(p, a, b, c); if(!test) { return false; } test = same_side(p, b, a, c); if(!test) { return false; } test = same_side(p, c, a, b); if(!test) { return false; } return true; }
bool intersect_inclusive(Line u, Line v) { if (!points_inline(u.a, u.b, v.a) || !points_inline(u.a, u.b, v.b)) return !same_side(u.a, u.b, v) && !same_side(v.a, v.b, u); bool ret = point_online_inclusive(u.a, v); ret = ret || point_online_inclusive(u.b, v); ret = ret || point_online_inclusive(v.a, u); ret = ret || point_online_inclusive(v.b, u); return ret; }
int solve() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int a=0;a<2;a++) { for(int b=0;b<2;b++) { point p1,p2; if(a==0)p1=lines[i].a; else p1=lines[i].b; if(b==0)p2=lines[j].a; else p2=lines[j].b; double dis=distance(p1,p2); if(dis<1e-8)continue; bool flag=true; for(int k=0;k<n;k++) { if(same_side(lines[k].a,lines[k].b,p1,p2)) { flag=false; break; } } if(flag) return true; } } } } return false; }
int intersect_in(point u1,point u2,point v1,point v2) { if (!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2); return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2); }
int intersect_in(point3 l1,point3 l2,point3 s1,point3 s2,point3 s3) { return !same_side(l1,l2,s1,s2,s3)&&!same_side(s1,s2,l1,l2,s3)&& !same_side(s2,s3,l1,l2,s1)&&!same_side(s3,s1,l1,l2,s2); }
int intersect_in(line3 l,plane3 s) { return !same_side(l.a,l.b,s)&&!same_side(s.a,s.b,l.a,l.b,s.c)&& !same_side(s.b,s.c,l.a,l.b,s.a)&&!same_side(s.c,s.a,l.a,l.b,s.b); }
//判两线段相交,包括端点和部分重合 int intersect_in(line u,line v){ if (!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b)) return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u); return dot_online_in(u.a,v)||dot_online_in(u.b,v)||dot_online_in(v.a,u)||dot_online_in(v.b,u); }