关于如何判断在平面上的两条线段是否相交

今天面试某公司时,被问道这道题目:

解决方法:

1.传统判断(这是我当时想到的答案):

*求出两条线段所对应的直线的交点(若直线不相交,那么线段肯定不想交)

*若有交点,则判断该交点是否分别在两条线段上,若符合条件,则两条线段相交,否则不想交

这是一个很简单也最容易向导的思路,于是我试着编程实现,结果确实写代码时有点复杂(主要是判断的情况太多就容易混乱)

2.算法2:

*分别求出两条线段所在的直线方程(斜率不存在的情况下直线方程为x-b=0)

*分别将一条线段的两个端点坐标代入另外一条线段直线方程,比如L1:ax+by+c=0,则有代入后的方程为result=ax+by+c,若是两个端点的结果的符号相反,则肯定该线段在另外一条直线的两侧。一次将两条线段都判断完。

*如果结果的乘积都为负或者为0(为0代表至少有一个端点在另外一条直线上),则代表两条线段相交。(这里得排除一种两条直线重合,而线段不相交的情况)

*根据原理:若是点在直线的上方(斜率存在),或者直线左方(斜率不存在)则代入ax+by+c=0.时值为负,反之为正

这种可能刚开始比较难想到,但其实在编程实现时相对简单。(最主要是感觉编写时头脑会更加清晰)

***主要算法代码:(我将这些功能代码封装进入了一个JudgeUtils的类中)

方法1:(判断两条线段是否相交的函数入口为

<strong>IsLineIntersection(LineSegment l1,LineSegment l2)//LineSegment是一个自定义的线段类</strong>
)

/**该类里面是一些判断的函数
 * 所有的判断函数全在这个类里面
 * static型函数供main方法使用
 * 工具类
 * */
public class JudgeUtils {
	/**判断两个点的起始与结束位置的函数,且进行校正
	 * 两个点如果x2>x1,则P1为起点,如果x2=x1,判断y2>y1,则P1为起点
	 * 传进去的形参是对象引用,所以可以直接改变值
	 * */
	public static void exchangePoint(Point startP,Point endP)
	{
		//记得进行处理,如果x2>x1,则P1为起点,如果x2=x1,判断y2>y1,则P1为起点
		//如果P1的起点比终点的x大,交换位置
		//在x相等时,判断y,如果P1的起点y比终点Y大,交换值
		if((startP.getX()>endP.getX())||((startP.getX()==endP.getX())&&(startP.getY()>endP.getY())))
		{
			double temp;
			//交换x值
			temp=startP.getX();
			startP.setX(endP.getX());
			endP.setX(temp);
			//交换Y的值
			temp=startP.getY();
			startP.setY(endP.getY());
			endP.setY(temp);
			System.out.println("起点与终点的值已经交换");
		}
	}
	/**判断两条线段是否相交的函数*/
	public static boolean IsLineIntersection(LineSegment l1,LineSegment l2)
	{
		//默认为不想交,满足一定条件才相交
		boolean isIntersection=false;
		//取得l1,l2的交点
		Point intersectionPoint=IntersectionOfLines(l1,l2);
		/**返
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值