计算几何练习4

直线与直线相交

【题目描述】:

给出两条直线(每条直线给出其上两个点),要求判断出这两条直线的关系:平行,同线或相交。如果相交还要求出交点坐标。

【输入描述】:

第一行一个数T,表示T组数据;

每组数据输入一行,8个数,分别表示ax,ay,bx,by,cx,cy,dx,dy,四个点的横纵坐标,其中前两个点表示一条直线,后两个点表示另一条直线。

【输出描述】:

对于每组数据输出一行;

如果平行输出“NONE”;如果共线输出“LINE”;如果相交输出交点的横纵坐标(精确到小数点后两位)。

【样例输入】:

5
0 0 4 4 0 4 4 0
5 0 7 6 1 0 2 3
5 0 7 6 3 -6 4 -3
2 0 2 27 1 5 18 5
0 3 4 0 1 2 2 5

【样例输出】:

2.00 2.00
NONE
LINE
2.00 5.00
1.07 2.20

【时间限制、数据范围及描述】:

时间:1s 空间:64M

T<=10,000

-10000<=所有点坐标<=10000


这题是一道相对来说比较简单的计算几何题目,有很多种方法,这里只介绍一种。直线与直线的位置关系只有三种:相交、平行、共线。我们第一个想到的就是计算直线的解析式来判断直线的位置关系。解析式分两步,斜率k和b。斜率的计算只需用斜率公式计算,而b的计算就把某个点的坐标和斜率带入即可。

AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
void work(){
	int x1,x2,y1,y2,x3,x4,y3,y4;
	double k1,k2,b1,b2,x,y;
	scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
	if(x1==x2){
		if(x3==x4){
			if(x1==x3){
				printf("LINE\n");
			}
			else{
				printf("NONE\n");
			}
		}
		else{
			k2=(double)((y4-y3)/((x4-x3)*1.0));
	        b2=(double)(y3-k2*x3);
			x=(double)(x1);
			y=(double)(k2*x+b2);
			printf("%.2lf %.2lf\n",x,y);
		}
		return;
	}
	if(x3==x4){
		k1=(double)((y2-y1)/((x2-x1)*1.0));
	    b1=(double)(y1-k1*x1);
		x=(double)(x3);
		y=(double)(k1*x+b1);
		printf("%.2lf %.2lf\n",x,y);
		return;
	}
	if(y1==y2){
		if(y3==y4){
			if(y3==y1){
				printf("LINE\n");
			}
			else{
				printf("NONE\n");
			}
		    return;
		}
	}
	k1=(double)((y2-y1)/((x2-x1)*1.0));
	k2=(double)((y4-y3)/((x4-x3)*1.0));
	b1=(double)(y1-k1*x1);
	b2=(double)(y3-k2*x3);
	if((y2-y1)*(x4-x3)==(x2-x1)*(y4-y3)){
		if(((x2*y1-x1*y2)*(x4-x3))==((x4*y3-x3*y4)*(x2-x1))){
			printf("LINE\n");
		}
		else{
			printf("NONE\n");
		}
	}
	else{
		x=(double)((b2-b1)/(k1-k2));
		y=k1*x+b1;
		printf("%.2lf %.2lf\n",x,y);
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		work();
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值