| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我有话要说!#include<stdio.h>
#include<math.h>
#define EPS 1e-9
//定义点
typedef struct Point
{
double x;
double y;
}Point;
//定义线段
typedef struct Lineseg
{
Point st;
Point ed;
}Lineseg;
//两个向量的叉积
double mult(Point a,Point b,Point c)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
//求最大值
double MAX(double x,double y)
{
if(x>y)
return x;
return y;
}
//求最小值
double MIN(double x,double y)
{
if(x>y)
return y;
return x;
}
//判断两线段是不是相交--这也是这个题目最主要的函数
bool intersect(Lineseg u,Lineseg v)
{//排斥实验
//+
//跨立实验
return MAX(u.st.x,u.ed.x)>=MIN(v.st.x,v.ed.x)
&& MAX(v.st.x,v.ed.x)>=MIN(u.st.x,u.ed.x)
&& MAX(u.st.y,u.ed.y)>=MIN(v.st.y,v.ed.y)
&& MAX(v.st.y,v.ed.y)>=MIN(u.st.y,u.ed.y)
&& mult(v.st,u.ed,u.st)*mult(u.ed,v.ed,u.st)>=0
&& mult(u.st,v.ed,v.st)*mult(v.ed,u.ed,v.st)>=0;
}
//判断线段是不是同四边形的边相交 如果相交则返回true 否则返回 false
bool judge(Point p1,Point p2,Point p3,Point p4,Lineseg l1)
{
Lineseg l2;
l2.st=p1;
l2.ed=p2;
if(intersect(l1,l2))
return true;
l2.st=p2;
l2.ed=p3;
if(intersect(l1,l2))
return true;
l2.st=p3;
l2.ed=p4;
if(intersect(l1,l2))
return true;
l2.st=p4;
l2.ed=p1;
if(intersect(l1,l2))
return true;
return false;
}
int main()
{
int T;
Lineseg l;
Point p1,p2,p3,p4;
double temp;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&l.st.x,&l.st.y,&l.ed.x,&l.ed.y);
scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p3.x,&p3.y);
/*
很重要的地方 应为它给的坐标 不一定是 x1<x3 y1>y3 我自己要转化
*/
if(p1.x>p3.x)
{
temp=p1.x;
p1.x=p3.x;
p3.x=temp;
}
if(p1.y<p3.y)
{
temp=p1.y;
p1.y=p3.y;
p3.y=temp;
}
//最重要的地方 判断线段的端点是不是在四边形中 如果在肯定相交
//这样做的目的是防止线段不同四边形的边相交 但是线段的整体切在四边形中 明白了吗?
// 线段在四边形中也是T 很多人是在这个地方卡到了啊 这个题目很变态的啊!
if((p1.x<=l.st.x&&l.st.x<=p3.x&&p3.y<=l.st.y&&l.st.y<=p1.y)||
(p1.x<=l.ed.x&&l.ed.x<=p3.x&&p3.y<=l.ed.y&&l.ed.y<=p1.y))
{
printf("T\n");
continue;
}
//将矩形的四个顶点分别求出来啊!
//其他的不说了 很简单的啊!
p2.x=p1.x;
p2.y=p3.y;
p4.x=p3.x;
p4.y=p1.y;
if(judge(p1,p2,p3,p4,l))
printf("T\n");
else
printf("F\n");
}
return 0;
}
/*
1
4 9 11 2 1 5 7 1
F
*/
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator