本人机械转行的IT小白,今天投简历时收到BOSS的测试题邀请,入行不久,算法不精通,不过最终还是做出来了,发第一篇博客记录一下

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、前言

已知同一平面内的三条线段的坐标,如何判断此三条线段能否构成一个三角形?

可以分5种情况:
1、点动成线,判断三条是线段,不是点;
2、三条线段的斜率K不可以相等,相等即平行;
3、判断两条线段在 x 以及 y 坐标的投影是否有重合。 有一个为真,则代表两线段必不可交。
4、最后如果相交则矢量叉积异号或为零,大于零则不相交
5、三条线段不可以相交于1点(关于这种情况,不是很了解算法的我仍然不知道怎么解答。。。)

二、直接上代码!

1.业务逻辑层

代码如下:

package com.Judge;

import com.Exception.NotALineException;
import com.Exception.NotATriangleException;

public class Judge {

    public void isATriangle(double l1x1, double l1y1, double l1x2, double l1y2,
                            double l2x1, double l2y1, double l2x2, double l2y2,
                            double l3x1, double l3y1, double l3x2, double l3y2) throws NotALineException, NotATriangleException {
        //首先判断用户输入的是三条线段,不是点
        if ((l1x1 == l1x2 && l1y1 == l1y2) || (l2x1 == l2x2 && l2y1 == l2y2) || (l3x1 == l3x2 && l3y1 == l3y2)) {
            throw new NotALineException("请确认输入的是线段,不是点");
        }
        //再判定三条线段是否两两相交
        //判定第一条线和第二条线是否相交
        boolean intersectionFirstWithSecond = intersection(l1x1, l1y1, l1x2, l1y2, l2x1, l2y1, l2x2, l2y2);
        //判定第一条线和第三条线是否相交
        boolean intersectionFirstWithThird = intersection(l1x1, l1y1, l1x2, l1y2, l3x1, l3y1, l3x2, l3y2);
        //判定第二条线和第三条线是否相交
        boolean intersectionSecondWithThird = intersection(l2x1, l2y1, l2x2, l2y2, l3x1, l3y1, l3x2, l3y2);
        //判定以上三条是否同时成立
        if (!intersectionFirstWithSecond || !intersectionFirstWithThird || !intersectionSecondWithThird) {
            throw new NotATriangleException("这三条线段不能组成三角形");
        } else {
            System.out.println(
                    "第一条线段的2点坐标为:(" + l1x1 + "," + l1y1 + ")(" + l1x2 + "," + l1y2 + ")\n" +
                    "第二条线段的2点坐标为:(" + l2x1 + "," + l2y1 + ")(" + l2x2 + "," + l2y2 + ")\n" +
                    "第三条线段的2点坐标为:(" + l3x1 + "," + l3y1 + ")(" + l3x2 + "," + l3y2 + ")\n" +
                    "此三条线段可以组成三角形");
        }
    }

    public boolean intersection(double l1x1, double l1y1, double l1x2, double l1y2,
                                double l2x1, double l2y1, double l2x2, double l2y2) throws NotATriangleException {
        //首先判断两条线段是否平行
        if ((l1y1 - l1y2) / (l1x1 - l1x2) == (l2y1 - l2y2) / (l2x1 - l2x2)) {
            throw new NotATriangleException("存在平行线段,这三条线段不能组成三角形");
        }
        // 其次判断两条线段在 x 以及 y 坐标的投影是否有重合。 有一个为真,则代表两线段必不可交。
        if (Math.max(l1x1, l1x2) < Math.min(l2x1, l2x2)
                || Math.max(l1y1, l1y2) < Math.min(l2y1, l2y2)
                || Math.max(l2x1, l2x2) < Math.min(l1x1, l1x2)
                || Math.max(l2y1, l2y2) < Math.min(l1y1, l1y2)) {
            throw new NotATriangleException("这三条线段不能组成三角形");
        }
        // 最后如果相交则矢量叉积异号或为零,大于零则不相交
        if ((((l1x1 - l2x1) * (l2y2 - l2y1) - (l1y1 - l2y1) * (l2x2 - l2x1))
                * ((l1x2 - l2x1) * (l2y2 - l2y1) - (l1y2 - l2y1) * (l2x2 - l2x1))) > 0
                || (((l2x1 - l1x1) * (l1y2 - l1y1) - (l2y1 - l1y1) * (l1x2 - l1x1))
                * ((l2x2 - l1x1) * (l1y2 - l1y1) - (l2y2 - l1y1) * (l1x2 - l1x1))) > 0) {
            throw new NotATriangleException("这三条线段不能组成三角形");
        }
        return true;
    }
}

2.异常类

代码如下(示例):

package com.Exception;
/*
* 不是一条直线异常
* */
public class NotALineException extends Exception{

    public NotALineException() {
    }


    public NotALineException(String message) {
        super(message);
    }
}
package com.Exception;
/*
 * 不能构成三角形异常
 * */
public class NotATriangleException extends Exception{

    public NotATriangleException() {
    }


    public NotATriangleException(String message) {
        super(message);
    }
}

3.测试类

代码如下(示例):

测试结果:

输出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

从汽车行业转型至无限前景和挑战的IT行业,我下了很大的决心,学习新知识的路上真的很难,想过放弃,但还是咬牙坚持着,为了这个活到老,学到死的行业奋斗吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值