第一篇题解报告哩(
终于想要来写题解了)
其实就是想把一些自己觉得有用的题记起来啦
题目在这 Intersecting Lines
题目大意:给你若干组线段让你判断两条线段之间的关系(平行 重合 相交)
思路:这不就是一道裸题吗虽然说刚接触也不熟悉
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps = 1e-8;
int T;
int sgn(double x){return x < -eps ? -1 : x > eps;}
struct Point{
double x,y;
Point (){}
Point (double x,double y): x (x),y (y){}
Point operator + (const Point& b) const{return Point(x + b.x,y + b.y);}
Point operator - (const Point& b) const{return Point(x - b.x,y - b.y);}
double operator * (const Point& b)const{return x * b.x + y * b.y;}
double operator ^ (const Point& b)const{return x * b.y - y * b.x;}
}p[4];
struct Line{
Point s,e;
Line(){}
Line(Point s,Point e): s(s),e(e){}
//返回pair second 为0重合 为1平行 为2相交且first为交点
pair<Point,int> operator &(const Line& b)const {
Point res = s;
if(sgn((s - e) ^ (b.s - b.e)) == 0){
if(sgn((b.s - s) ^ (b.e - s)) == 0) return make_pair(res,0);
return make_pair(res,1);
}
double t = ((s - b.s) ^ (b.s - b.e)) / ((s - e) ^ (b.s - b.e));
res.x += (e.x - s.x) * t;
res.y += (e.y - s.y) * t;
return make_pair(res,2);
}
};
int main(){
scanf("%d",&T);
puts("INTERSECTING LINES OUTPUT");
while(T--){
for(int i = 0;i < 4;i ++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
Line l[2];
l[0] = Line(p[0],p[1]);
l[1] = Line(p[2],p[3]);
pair <Point,int> ans = l[0] & l[1];
if(ans.second == 0) puts("LINE");
else if(ans.second == 1) puts("NONE");
else{
printf("POINT %.2f %.2f\n",ans.first.x,ans.first.y);
}
}
puts("END OF OUTPUT");
return 0;
}