矢量法判断圆与三角形相交

利用矢量法避开讨论正负的问题,大意就是给三角形判断与圆是否相交的问题
struct l
{
double x;
double y;
};
inline double dis(double x,double y,double m,double n,double o,double p)\判断可能的三种情况,大于1为远离点,小于0为近点,否则为中间点
{
double r=((o-m)(x-m)+(p-n)(y-n))/((o-m)(o-m)+(p-n)(p-n));
if(r<=0) return sqrt((x-m)(x-m)+(y-n)(y-n));\为近点,连接两点求距离即为点到线段最短距离
if(r>=1) return sqrt((x-o)(x-o)+(y-p)(y-p));\为远点,连接另两点求为最短距离
else return sqrt((x-m)(x-m)+(y-n)(y-n)-((o-m)(x-m)+(p-n)(y-n))((o-m)(x-m)+(p-n)(y-n))/((o-m)(o-m)+(p-n)(p-n)));\为中间点,作垂线即为最短距离
}
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
double x,y,r,sum=0;
double z,p;
cin>>x>>y>>r;
l a[3];
for(int i=0;i<3;i++)
{
cin>>z>>p;
a[i].x=z;
a[i].y=p;
}
for(int i=0;i<3;i++)
{
if(((a[i].x)-x)
((a[i].x)-x)+((a[i].y)-y)((a[i].y)-y)<=rr) sum++;\判断是否在圆上,注意圆心坐标不一定是(0,0)
}
if(sum>0&&sum<3) cout<<"Yes"<<endl;
else if(sum==0)
{
double ab=dis(x,y,a[0].x,a[0].y,a[1].x,a[1].y);
double bc=dis(x,y,a[0].x,a[0].y,a[2].x,a[2].y);
double ac=dis(x,y,a[2].x,a[2].y,a[1].x,a[1].y);
if(ab>r&&bc>r&&ac>r) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}

posted @ 2021-01-09 22:09  mdslanren  阅读(231)  评论(0)    收藏  举报