今天面试某公司时,被问道这道题目:
解决方法:
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);
/**返