判断两条线段是否相交 java_JAVA版判断两条线是否相交 | 学步园

这是一个使用JAVA编程语言实现的算法,用于判断两条线段是否相交。通过比较线段端点坐标和计算交点,可以确定线段的相交情况,包括相交于端点、内部或完全不相交。
摘要由CSDN通过智能技术生成

/**

* 判断两条线是否相交 a 线段1起点坐标 b 线段1终点坐标 c 线段2起点坐标 d 线段2终点坐标 intersection 相交点坐标

* reutrn 是否相交: 0 : 两线平行 -1 : 不平行且未相交 1 : 两线相交

*/

public int segIntersect(Point A, Point B, Point C, Point D) {

Point intersection = new Point();

if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) + Math.abs(D.getY() - C.getY())

+ Math.abs(D.getX() - C.getX()) == 0) {

if ((C.getX() - A.getX()) + (C.getY() - A.getY()) == 0) {

System.out.println("ABCD是同一个点!");

} else {

System.out.println("AB是一个点,CD是一个点,且AC不同!");

}

return 0;

}

if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) == 0) {

if ((A.getX() - D.getX()) * (C.getY() - D.getY()) - (A.getY() - D.getY()) * (C.getX() - D.getX()) == 0) {

System.out.println("A、B是一个点,且在CD线段上!");

} else {

System.out.println("A、B是一个点,且不在CD线段上!");

}

return 0;

}

if (Math.abs(D.getY() - C.getY()) + Math.abs(D.getX() - C.getX()) == 0) {

if ((D.getX() - B.getX()) * (A.getY() - B.getY()) - (D.getY() - B.getY()) * (A.getX() - B.getX()) == 0) {

System.out.println("C、D是一个点,且在AB线段上!");

} else {

System.out.println("C、D是一个点,且不在AB线段上!");

}

return 0;

}

if ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B.getX() - A.getX()) * (C.getY() - D.getY()) == 0) {

//   System.out.println("线段平行,无交点!");

return 0;

}

intersection

.setX(((B.getX() - A.getX()) * (C.getX() - D.getX())

* (C.getY() - A.getY()) - C.getX()

* (B.getX() - A.getX()) * (C.getY() - D.getY()) + A

.getX() * (B.getY() - A.getY()) * (C.getX() - D.getX()))

/ ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B

.getX() - A.getX()) * (C.getY() - D.getY())));

intersection

.setY(((B.getY() - A.getY()) * (C.getY() - D.getY())

* (C.getX() - A.getX()) - C.getY()

* (B.getY() - A.getY()) * (C.getX() - D.getX()) + A

.getY() * (B.getX() - A.getX()) * (C.getY() - D.getY()))

/ ((B.getX() - A.getX()) * (C.getY() - D.getY()) - (B

.getY() - A.getY()) * (C.getX() - D.getX())));

if ((intersection.getX() - A.getX()) * (intersection.getX() - B.getX()) <= 0

&& (intersection.getX() - C.getX())

* (intersection.getX() - D.getX()) <= 0

&& (intersection.getY() - A.getY())

* (intersection.getY() - B.getY()) <= 0

&& (intersection.getY() - C.getY())

* (intersection.getY() - D.getY()) <= 0) {

if(  (A.getX() == C.getX() && A.getY() == C.getY() ) || ( A.getX() == D.getX() && A.getY() == D.getY() )

|| (B.getX() == C.getX() && B.getY() == C.getY() ) || ( B.getX() == D.getX() && B.getY() == D.getY() )){

System.out.println("线段相交于端点上");

return 2;

}else {

System.out.println("线段相交于点(" + intersection.getX() + ","

+ intersection.getY() + ")!");

return 1; // '相交

}

} else {

//   System.out.println("线段相交于虚交点(" + intersection.getX() + ","

//     + intersection.getY() + ")!");

return -1; // '相交但不在线段上

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值