POJ 1269 Intersecting Lines

非常基础的判断直线关系题,用最直观的方式:写出直线的一般式,然后根据高中的解析几何判断两条直线是否相交,相同和平行。

#include<stdio.h>
double eps=1e-6;
double abs(double a)
{
	if(a<0)
		return -a;
	return a;
}
struct Point{
	double x,y;
};
struct line{
	double a,b,c;
};
line makeLine(Point s,Point end)		//通过直线上两点构造直线的一般式
{
	line l;
	l.a=end.y-s.y;
	l.b=s.x-end.x;
	l.c=end.x*s.y-s.x*end.y;
	return l;
}
int main()
{
	int n;
	Point s1,e1,s2,e2,ans;
	scanf("%d",&n);
	printf("INTERSECTING LINES OUTPUT\n");
	while(n--)
	{
		scanf("%lf %lf %lf %lf",&s1.x,&s1.y,&e1.x,&e1.y);
		scanf("%lf %lf %lf %lf",&s2.x,&s2.y,&e2.x,&e2.y);
		line l1,l2;
		l1=makeLine(s1,e1);		//分别构造两条直线
		l2=makeLine(s2,e2);
		if(abs(l1.a*l2.b-l1.b*l2.a)<eps)		//两条直线不想交的情况
		{
			if(abs(l1.a*l2.c-l1.c*l2.a)>eps || (abs(l1.a)<eps && abs(l2.a)<eps && abs(l1.c-l2.c)>eps))			//判断两条线段不相同
				printf("NONE\n");
			else
				printf("LINE\n");
		}
		else
		{
			ans.x=(l1.b*l2.c-l2.b*l1.c)/(l2.b*l1.a-l1.b*l2.a);//根据直线方程求解x,y,因为前面的情况已经排除,所以必然有解
			ans.y=-(l1.a*l2.c-l2.a*l1.c)/(l2.b*l1.a-l1.b*l2.a);
			printf("POINT %.2f %.2f\n",ans.x,ans.y);
		}
	}
	printf("END OF OUTPUT\n");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值