我有2个最大值和最小值,例如:
22 ------ 26 and 16 ------ 22 (OK, because of 22)
22 ------ 26 and 10 ------ 12 (FAILS)
22 ------ 30 and 29 ------ 33 (OK because of 29 and 30)
我想知道在Java中是否存在代表最大值和最小值的集合之间的交集。
我试图在一篇论文中做到这一点并得到一个if有4个测试,但我发现它们失败了:
if ((thisEntityLeftPosX <= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)
|| (thisEntityLeftPosX >= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)
|| (thisEntityLeftPosX <= anotherEntityLeftPosX && thisEntityRightPosX <= anotherEntityRightPosX)
|| (thisEntityLeftPosX >= anotherEntityLeftPosX && thisEntityRightPosX >= anotherEntityRightPosX)) {
也许有一种更简单的方法。
不重复,因为这不是关于集合中包含的数字,而是集合交集。
答案 0 :(得分:4)
以下内容应该有效,其中a
和b
是您的两个范围。
if (aMin <= bMax && aMax >= bMax ||
bMin <= aMax && bMax >= aMax)
{
// OVERLAP
}
答案 1 :(得分:3)
开始考虑反向问题,两个区间,在数学上,可以描述为[amin,amax]和[bmin,bmax]不重叠iff(amin> bmax或bmin> amax)。因此,通过布尔表达式的简单反转,这些区间重叠iff :( amin <= bmax和bmin&lt; = amax)。
答案 2 :(得分:2)
您可以按照以下方式执行此操作:
int left = Math.max(thisEntityLeftPosX,anotherEntityLeftPosX);
int right = Math.min(thisEntityRightPosX,anotherEntityRightPosX);
if(left <= right) {
//overlap
} else {
//don't overlap
}
jDoodle demo with your sample input
这个想法是你计算某种交叉点:交集点开始于给定的两个交点;并以两者中的最小值结束。如果left
小于或等于right
,则交叉点中有元素。
此程序使 thisEntityLeftPosX
小于thisEntityRightPosX
的假设。同样适用于another...
。如果假设不成立。您可以将代码修改为:
int temp;
if(thisEntityLeftPosX > thisEntityRightPosX) {
temp = thisEntityLeftPosX;
thisEntityLeftPosX = thisEntityRightPosX;
thisEntityRightPosX = temp;
}
if(anotherEntityLeftPosX > anotherEntityRightPosX) {
temp = anotherEntityLeftPosX;
anotherEntityLeftPosX = anotherEntityRightPosX;
anotherEntityRightPosX = temp;
}
int left = Math.max(thisEntityLeftPosX,anotherEntityLeftPosX);
int right = Math.min(thisEntityRightPosX,anotherEntityRightPosX);
if(left <= right) {
//overlap
} else {
//don't overlap
}
可能的额外情况是,如果范围相交,则立即构建交点的范围。对于[22;30]
和[29;33]
,这会生成新范围[left;right]=[29;33]
。
答案 3 :(得分:1)
只需使用min / max:
如果后续条件为真 - 他们不相交
maxA < minB || maxB < minA