数论之两直线相交
这种问题一般两种解法 一种就是普通的kx+b=kx+b,求解该方程即可; 还有一种就是跨立相交实验 下面给出代码
#include<bits/stdc++.h>
using namespace std;
struct line{
double x1,y1;
double x2,y2;
};
double dis(double x1,double y1,double x2,double y2){///叉乘
return x1*y2-x2*y1;
}
bool judge1(line a,line b){//跨立
if(max(a.x1,a.x2)<min(b.x1,b.x2)||max(b.x1,b.x2)<min(a.x1,a.x2)
||max(a.y1,a.y2)<min(b.y1,b.y2)||max(b.y1,b.y2)<min(a.y1,a.y2))return 0;
return 1;
}
bool judge2(line l1,line l2){//相交 在直线两侧即可
if( dis(l2.x1-l1.x1,l2.y1-l1.y1,l2.x1-l2.x2,l2.y1-l2.y2)*dis(l2.x1-l1.x2,l2.y1-l1.y2,l2.x1-l2.x2,l2.y1-l2.y2) <= 0 &&
dis(l1.x1-l2.x1,l1.y1-l2.y1,l1.x1-l1.x2,l1.y1-l1.y2)*dis(l1.x1-l2.x2,l1.y1-l2.y2,l1.x1-l1.x2,l1.y1-l1.y2) <= 0) return 1;
return 0;
}
void slove(){
line l1,l2;
cin>>l1.x1>>l1.y1>>l1.x2>>l1.y2;
cin>>l2.x1>>l2.y1>>l2.x2>>l2.y2;
if(judge1(l1,l2)&&judge2(l1,l2)){
cout<<"YES\n";
}
else {
//cout<<judge1(l1,l2)<<" "<<judge2(l1,l2);
cout<<"NO\n";
}
}
int main(){///跨立与相交
int N;
cin>>N;
while(N--){
slove();
}
return 0;
}
首先judge1非常好理解就是两个线段相交那么他们水平方向或者垂直方向上一定有重合部分,没有重合部分就return 0; 其次是judge2我画了个图比较好理解 就是对于任意一组两条虚线一定在实线两侧的意思 其次这道题最大的坑埋在要开double的基础上的。