提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、前言
已知同一平面内的三条线段的坐标,如何判断此三条线段能否构成一个三角形?
可以分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行业,我下了很大的决心,学习新知识的路上真的很难,想过放弃,但还是咬牙坚持着,为了这个活到老,学到死的行业奋斗吧!