给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"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
思路:分别判断 线段a是否与直线b相交,若都相交则 Yes ,否则No
线段a与直线b相交:求出线段a的中点及两个端点到直线b的距离 h0,h1,h2。若 h0*2==h1+h2则说明线段a在直线b的一侧,不相交;否则相交
code:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int T;
long long int l1[2][2];
long long int l2[2][2];
bool Cross(long long int l1[][2],long long int l2[][2]);
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while(T--){
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
cin>>l1[i][j];
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
cin>>l2[i][j];
if(Cross(l1,l2)==true&&Cross(l2,l1)==true) puts("Yes");
else puts("No");
}
return 0;
}
bool Cross(long long int l1[][2],long long int l2[][2])
{
long long int h0,h1,h2;
if(l1[0][0]==l1[1][0]){
if(l2[0][0]<=l1[0][0]&&l2[1][0]>=l1[0][0]||
l2[0][0]>=l1[0][0]&&l2[1][0]<=l1[0][0])
return true;
else return false;
}else{
long long int a,b,c;
a=l1[1][1]-l1[0][1];
b=-(l1[1][0]-l1[0][0]);
c=-b*l1[0][1]-a*l1[0][0];
long long int x0=l2[0][0]+l2[1][0],y0=l2[0][1]+l2[1][1];
h0=abs(a*x0+b*y0+c*2);
h1=abs(a*l2[0][0]+b*l2[0][1]+c);
h2=abs(a*l2[1][0]+b*l2[1][1]+c);
long long int hh=h1+h2;
if(!h1||!h2||h0!=hh)
return true;
else return false;
}
}
另一思路是 用向量叉积来判断线段相交(暂时没看懂)
附上代码:
#include <stdio.h>
int CrossProduct(__int64 x1, __int64 y1, __int64 x2, __int64 y2)
{
__int64 xx = x1 * y2;
__int64 yy = y1 * x2;
if (xx == yy) return 0;
return xx > yy ? 1 : -1;
}
int main()
{
int N;
scanf("%d", &N);
__int64 x1, y1, x2, y2, x3, y3, x4, y4;
while (N--) {
scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d %I64d",
&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
if (CrossProduct(x2 - x1, y2 - y1, x3 - x1, y3 - y1) * CrossProduct(x2 - x1, y2 - y1, x4 - x1, y4 - y1) <= 0 &&
CrossProduct(x4 - x3, y4 - y3, x1 - x3, y1 - y3) * CrossProduct(x4 - x3, y4 - y3, x2 - x3, y2 - y3) <= 0){
printf("Yes\n");
} else printf("No\n");
}
return 0;
}