线段相交
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264
题目:
给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8)
(直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)
Output
输出共T行,如果相交输出"Yes",否则输出"No"。
Input示例
2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1
Output示例
Yes No
看的第一眼觉得和求两个直线是否存在交点差不多,但是好麻烦,而且应该过不了,毕竟线段和直线是有很大区别的;
然后百度了一下,觉得这篇博客讲的很好!http://blog.csdn.net/yao1373446012/article/details/51469175
所以这个题目就只要弄清楚关系别写错就能AC了!
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
struct point
{
double x;
double y;
}P1,P2,Q1,Q2;
int main()
{
double x1,y1,x2,y2,x3,y3,x4,y4;
int t;
cin>>t;
while (t--)
{
cin>>P1.x>>P1.y>>P2.x>>P2.y>>Q1.x>>Q1.y>>Q2.x>>Q2.y;
double sum1=(P1.x-Q1.x)*(Q2.y-Q1.y)-(P1.y-Q1.y)*(Q2.x-Q1.x);
double sum2=(P2.x-Q1.x)*(Q2.y-Q1.y)-(P2.y-Q1.y)*(Q2.x-Q1.x);
double sum3=(Q1.x-P1.x)*(P2.y-P1.y)-(Q1.y-P1.y)*(P2.x-P1.x);
double sum4=(Q2.x-P1.x)*(P2.y-P1.y)-(Q2.y-P1.y)*(P2.x-P1.x);
if (sum1*sum2<=0&&sum3*sum4<=0)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}