//判定线段与空间三角形相交,包括交于边界和(部分)包含
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));
}
Пример #2
0
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;
}
Пример #3
0
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);
}
Пример #8
0
//判两线段相交,包括端点和部分重合
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);
}