线段是否相交

给定两条线段,判断是否相交

#include<iostream>  
#include<algorithm>//use sort
#include<cmath>//use fabs
using namespace std;
struct Point//点坐标
{
	double x;
	double y;
};
struct Line//线段属性
{
	double k;
	double b;
	Point p1;
	Point p2;
};
void IsIntersect(Line &line1, Line &line2);
int main()
{
	Line l1, l2;
	cin >> l1.p1.x >> l1.p1.y;
	cin >> l1.p2.x >> l1.p2.y;
	cin >> l2.p1.x >> l2.p1.y;
	cin >> l2.p2.x >> l2.p2.y;
	IsIntersect(l1, l2);
	return 0;
}

void GetLine(Line &line)//求出线段的k和b
{
	//不考虑两点横坐标相等
	line.k = (line.p1.y - line.p2.y) / (line.p1.x - line.p2.x);
	line.b = line.p1.y - line.k*line.p1.x;
}
bool JudgeIsIntersect(Line &line,double &pointY)//判断斜率存在的线段的两个纵坐标与直线交点的纵坐标,如果相交,那么交点的纵坐标是在line2两点纵坐标的中间
{
	if (line.p1.y >= line.p2.y)
	{
		if (pointY <= line.p1.y&&pointY >= line.p2.y)
			return true;
		else
			return false;
	}
	if (line.p1.y < line.p2.y)
	{
		if (pointY <= line.p2.y&&pointY >= line.p1.y)
			return true;
		else
			return false;
	}
}
void IsIntersect(Line &line1, Line &line2)
{
	//两个变量判断斜率是否存在
	double line1X = line1.p1.x - line1.p2.x;
	double line2X = line2.p1.x - line2.p2.x;
	/*
	分四种情况
	1.line1,line2斜率都不存在
	2.line1斜率不存在,line2存在
	3.line1存在,line2的斜率不存在
	4.line1,line2的斜率都存在
	*/

	//1.
	//line1,line2斜率都不存在
	if (line1X == 0 && line2X == 0)
	{
		if (line1.p1.x == line2.p1.x)//共线:分为两个,相交(重合)与不相交
		{
			//如何判断是重合呢还是没有相交呢?
			//两条线段,四个点,一条直线上,取两条线段横坐标之和即fabs(line1.p1.x - line1.p2.x) + fabs(line2.p1.x - line2.p2.x)
			//这四个横坐标,有最大也有最小,那么最大到最小的距离double length = a[4] - a[0]
			//通过比较这两个数值即可判断
			double a[4] = { line1.p1.y,line1.p2.y,line2.p1.y,line2.p2.y };
			sort(a, a + 4);
			double length = a[3] - a[0];
			double lengthSum = fabs(line1.p1.y - line1.p2.y) + fabs(line2.p1.y - line2.p2.y);
			if (length > lengthSum)
				cout << "不相交\n";
			else
				cout << "相交\n";
		}
		else
			cout << "不想交\n";
	}

	//2.
	//line1斜率不存在,line2存在
	else if (line1X == 0 && line2X != 0)
	{
		GetLine(line2);
		double intersectionY = line2.k*line1.p1.x + line2.b;//直线交点的纵坐标,如果相交,那么交点的纵坐标是在line2两点纵坐标的中间
		if (JudgeIsIntersect(line2, intersectionY))
			cout << "相交\n";
		else
			cout << "不相交\n";
	}
	//3.
	//line1存在,line2的斜率不存在
	else if (line1X != 0 && line2X == 0)
	{
		GetLine(line1);
		double intersectionY = line1.k*line2.p1.x + line1.b;
		if (JudgeIsIntersect(line1, intersectionY))
			cout << "相交\n";
		else
			cout << "不相交\n";
	}
	//4.
	//line1,line2的斜率都存在
	else
	{
		GetLine(line1);
		GetLine(line2);
		if (line1.k == line2.k)//斜率相同
		{
			if (line1.b == line2.b)//共线:分为两个,相交(重合)与不相交
			{
				double a[4] = { line1.p1.x,line1.p2.x,line2.p1.x,line2.p2.x };
				sort(a, a + 4);
				double length = a[3] - a[0];
				double lengthSum = fabs(line1.p1.x - line1.p2.x) + fabs(line2.p1.x - line2.p2.x);
				if (length > lengthSum)
					cout << "不相交\n";
				else
					cout << "相交\n";
			}
			else
				cout << "不相交\n";
		}
		else//斜率不同
		{
			double intersectionX = (line2.b - line1.b) / (line1.k - line2.k);

			double line1XLength = fabs(line1.p1.x - line1.p2.x);
			double line1Length = fabs(line1.p1.x - intersectionX) + fabs(line1.p2.x - intersectionX);
			double line2XLength = fabs(line2.p1.x - line2.p2.x);
			double line2Length = fabs(line2.p1.x - intersectionX) + fabs(line2.p2.x - intersectionX);
			if ((line1XLength == line1Length) && (line2XLength == line2Length))
				cout << "相交\n";
			else
				cout << "不相交\n";
		}
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值