本文主要是介绍HDU-Rectangle and Circle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
点击打开链接
这个是一个模板题,谢谢岩儿提供的模板。
疑问:直线到点的距离模板 和 线段的到点距离的模板有什么区别?应该怎么写?
Trick:我自己使用的一个for循环中每一个边必须是矩形的边而不应该是对角线,所以pp数组的顺序是固定的。
#include<iostream>
#include<cstdio>#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-10;
typedef struct
{
double x, y;
}point;
double dist(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
//点到直线的距离
double disptoline(point p,point l1,point l2)
{
return fabs(xmult(p,l1,l2))/dist(l1,l2);
}
//相交返回1,不想交返回0
int intersect_seg_circle(point c,double r, point l1,point l2)
{
double t1=dist(c,l1)-r,t2=dist(c,l2)-r;
point t=c;
if (t1<eps||t2<eps)
return t1>-eps||t2>-eps;
t.x+=l1.y-l2.y;
t.y+=l2.x-l1.x;
return xmult(l1,c,t)*xmult(l2,c,t)<eps&&disptoline(c,l1,l2)-r<eps;
}
point pp[4];
point cc;
int main()
{
int Case;
double X, Y, R, X1, Y1, X2, Y2;
cin>>Case;
while( Case-- )
{
cin>>X>>Y>>R>>X1>>Y1>>X2>>Y2;
pp[0].x = X1;
pp[0].y = Y1;
pp[1].x = X1;
pp[1].y = Y2;
pp[2].x = X2;
pp[2].y = Y2;
pp[3].x = X2;
pp[3].y = Y1;
cc.x = X;
cc.y = Y;
bool flag = false;
for(int i = 0; i < 4; i++)
{
if( intersect_seg_circle(cc, R, pp[i % 4], pp[(i+1) % 4]) ) { flag = true; break; }
}
if( flag ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
这篇关于HDU-Rectangle and Circle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!