这是学了计算几何后做的第一道题,刚开始没看清题意以为是求线段的。于是模版往上一套WA,悲剧啊
后来好好看了一下题目 又看了一下别人的代码 发现是自己题目没看清 原来是过这两个点的直线 改了之后果断AC啊! 高兴 虽然这是一道很水的题目 但是还是值得高兴
需要的知识大家都会 两条直线求交点难道自己不会推 肯定会啊 自己推吧
下面是我写的代码 仅供参考
#include<cstdio>///判断两条是否相交 共线 相交求出交点
#include<cstring>
#include<cmath>
#include<algorithm>
#define eps 1e-8
using namespace std;
struct Point
{
double x,y;
}s[4];
typedef struct Point point;
double multi(point p0, point p1, point p2)//叉积
{
return ( p1.x - p0.x )*( p2.y - p0.y )-( p2.x - p0.x )*( p1.y - p0.y );
}
int isIntersected(point s1,point e1, point s2,point e2)//判断是否相交 在一条线上 或不相交
{
if(fabs(multi(s1,e1,s2))<=eps&&fabs(multi(s1,e1,e2))<=eps)printf("LINE\n");
else if((e1.x-s1.x)*(e2.y-s2.y)==(e2.x-s2.x)*(e1.y-s1.y)) printf("NONE\n");
else //注意这要求的是两条直线的交点 不是两条线段的
{
point jiaodian;
double a1=s1.y-e1.y;
double b1=e1.x-s1.x;
double c1=s1.x*e1.y-e1.x*s1.y;
double a2=s2.y-e2.y;
double b2=e2.x-s2.x;
double c2=s2.x*e2.y-e2.x*s2.y;
jiaodian.x=(b1*c2-b2*c1)/(a1*b2-a2*b1);
jiaodian.y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
printf("POINT %.2f %.2f\n",jiaodian.x,jiaodian.y);
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOACL
int N;
scanf("%d",&N);
printf("INTERSECTING LINES OUTPUT\n");
while(N--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&s[0].x,&s[0].y,&s[1].x,&s[1].y,&s[2].x,&s[2].y,&s[3].x,&s[3].y);
isIntersected(s[0],s[1],s[2],s[3]);
}
printf("END OF OUTPUT\n");
return 0;
}