poj 1269 模拟 double输出用%f!!!!!!

本文介绍了一种算法,用于判断由四点定义的两组直线之间的位置关系,包括平行、重合或相交,并详细解释了斜率比较和特殊情况处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给出四个点,前两个点确定一条直线,后两个点确定一条直线。判断这两条直线的位置关系。

题解:

1.先判断斜率是否相等,如果斜率相等,那么两条直线重合或平行。若斜率不相同,则求交点。

2.注意斜率不存在即直线垂直于x轴的情况。

3.注意前两个点和后两个点会有重复点。

4.调试时查看变量fabs(0) = 8064 ,但其实运行时fabs(0) = 0。

5.一直WA是因为输出浮点数用了%.2lf,改为%.2f后就过了!!!!!!!!!!!!!!!

#include<stdio.h>
#include<string.h> 
#include<algorithm>
#include<math.h>
using namespace std ;
#define eps 1e-8
double x1 , yy1 , x2 , y2 , x3 , y3 , x4 , y4 ;
bool para()
{
	int para_num = 0 ; //判断有几个直线与x轴垂直 
	double slope_1 , slope_2 ;
	if(x1 == x2) 
	   para_num ++ ;
	if(x3 == x4) 
	   para_num ++ ;
	if(para_num == 1) //只有一个与x轴垂直的直线 那么一定有交点 
	   return 0 ;
	if(para_num == 2) //两个直线都与x轴垂直 那么一定没有单独的交点 
	   return 1 ;
	slope_1 = (y2 - yy1) / (x2 - x1) ; 
	slope_2 = (y4 - y3) / (x4 - x3) ;
	return  fabs(slope_1 - slope_2) < eps ; //判断没有垂直x轴的两条直线是否斜率相等  
}
bool same()
{
	//先判断是不是两条垂直于x轴的平行直线 
	if(fabs(x2 - x1) < eps && fabs(x3 - x1) < eps && fabs(x4 - x1) < eps)
	   return 1 ;
	if(fabs(x3 - x1) < eps && fabs(y3 - yy1) < eps || 
	   fabs(x4 - x1) < eps && fabs(y4 - x1) < eps ||
	   fabs(x3 - x2) < eps && fabs(y3 - y2) < eps || 
	   fabs(x4 - x2) < eps && fabs(y4 - y2) < eps) 
	   return 1 ;
	double slope_0 , slope_1 , slope_2 , slope_3 , slope_4 ;
	slope_0 = (y2 - yy1) / (x2 - x1) ;
	slope_1 = (y3 - yy1) / (x3 - x1) ;
	slope_2 = (y4 - yy1) / (x4 - x1) ;
	slope_3 = (y3 - y2) / (x3 - x2) ;
	slope_4 = (y4 - y2) / (x4 - x2) ;
	return  fabs(slope_1 - slope_0) < eps && 
	        fabs(slope_2 - slope_0) < eps && 
	        fabs(slope_3 - slope_0) < eps && 
			fabs(slope_4 - slope_0) < eps  ;
}
void cal()
{
	double x , y ;
	double k1 , k2 ;
	double b1 , b2 ;
	if(fabs(x2 - x1) < eps)
	{
		k2 = (y4 - y3) / (x4 - x3) ;
		b2 = y4 - k2 * x4 ;
		x = x1 ;
		y = k2 * x + b2 ;
		printf("POINT %.2f %.2f\n" , x , y) ; 
		return ;
	}
	if(fabs(x4 - x3) < eps)
	{
		k1 = (y2 - yy1) / (x2 - x1) ;
		b1 = y2 - k1 * x2 ;
		x = x3 ;
		y = k1 * x + b1 ;
		printf("POINT %.2f %.2f\n" , x , y) ; 
		return ;
	}
	k1 = (y2 - yy1) / (x2 - x1) ;
	b1 = y2 - k1 * x2 ;
	k2 = (y4 - y3) / (x4 - x3) ;
	b2 = y4 - k2 * x4 ;
	x = (b1 - b2) / (k2 - k1) ;
	y = k1 * x + b1 ;
	printf("POINT %.2f %.2f\n" , x , y) ; 
}
int main()
{
	int t ;
	scanf("%d" , &t) ; 
	printf("INTERSECTING LINES OUTPUT\n") ;
	while(t --)
	{
		scanf("%lf%lf%lf%lf%lf%lf%lf%lf" , &x1 , &yy1 , &x2 , &y2 , &x3 , &y3 , &x4 , &y4) ;
		if(para()) //两个直线的斜率相等 
		{
			if(same())
			   printf("LINE\n") ;
			else
			   printf("NONE\n") ;
		}
		else
		{
			cal() ;
		}
	}  
	printf("END OF OUTPUT\n") ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值