实现java判断两个三角形是否相交
简介
本文将教会一位刚入行的小白如何使用Java编程语言来判断两个三角形是否相交。我们将按照以下步骤进行实现:
- 获取两个三角形的坐标
- 判断两个三角形是否存在共享的边
- 若存在共享的边,则判断两个三角形是否有交叉的边
- 若存在交叉的边,则判断两个三角形是否相交
步骤一:获取两个三角形的坐标
首先,我们需要获取两个三角形的坐标。可以定义一个Triangle
类,并在其中定义三个点的坐标。
class Triangle {
Point p1;
Point p2;
Point p3;
}
class Point {
int x;
int y;
}
步骤二:判断两个三角形是否存在共享的边
接下来,我们需要判断两个三角形是否存在共享的边。可以定义一个方法hasSharedEdge
来实现该功能。
boolean hasSharedEdge(Triangle triangle1, Triangle triangle2) {
if (hasEdge(triangle1.p1, triangle2) || hasEdge(triangle1.p2, triangle2) || hasEdge(triangle1.p3, triangle2)) {
return true;
}
return false;
}
boolean hasEdge(Point point, Triangle triangle) {
if (pointOnLine(point, triangle.p1, triangle.p2) || pointOnLine(point, triangle.p2, triangle.p3) || pointOnLine(point, triangle.p3, triangle.p1)) {
return true;
}
return false;
}
boolean pointOnLine(Point point, Point lineStart, Point lineEnd) {
int dxc = point.x - lineStart.x;
int dyc = point.y - lineStart.y;
int dxl = lineEnd.x - lineStart.x;
int dyl = lineEnd.y - lineStart.y;
int cross = dxc * dyl - dyc * dxl;
if (cross != 0) {
return false;
}
if (Math.abs(dxl) >= Math.abs(dyl)) {
if (dxl > 0) {
if (lineStart.x > point.x || point.x > lineEnd.x) {
return false;
}
} else {
if (lineEnd.x > point.x || point.x > lineStart.x) {
return false;
}
}
} else {
if (dyl > 0) {
if (lineStart.y > point.y || point.y > lineEnd.y) {
return false;
}
} else {
if (lineEnd.y > point.y || point.y > lineStart.y) {
return false;
}
}
}
return true;
}
步骤三:判断两个三角形是否有交叉的边
接下来,我们需要判断两个三角形是否有交叉的边。可以定义一个方法hasCrossingEdge
来实现该功能。
boolean hasCrossingEdge(Triangle triangle1, Triangle triangle2) {
if (hasEdgeCrossing(triangle1.p1, triangle1.p2, triangle2) || hasEdgeCrossing(triangle1.p2, triangle1.p3, triangle2) || hasEdgeCrossing(triangle1.p3, triangle1.p1, triangle2)) {
return true;
}
return false;
}
boolean hasEdgeCrossing(Point lineStart1, Point lineEnd1, Triangle triangle) {
if (lineIntersectsLine(lineStart1, lineEnd1, triangle.p1, triangle.p2) || lineIntersectsLine(lineStart1, lineEnd1, triangle.p2, triangle.p3) || lineIntersectsLine(lineStart1, lineEnd1, triangle.p3, triangle.p1)) {
return true;
}
return false;
}
boolean lineIntersectsLine(Point lineStart1, Point lineEnd1, Point lineStart2, Point lineEnd2) {
int d1 = direction(lineStart2, lineEnd2, lineStart1);
int d2 = direction(lineStart2, lineEnd2, lineEnd1);
int d3 = direction(lineStart1, lineEnd1, lineStart2);
int d4 = direction(lineStart1, lineEnd1, lineEnd2);
if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {
return true;
} else if (d1 ==