假设我有一张带有某种数字的图像。用户可以通过在图周围绘制边界框来选择其中的2个。我想要做的是计算这两个边界框之间的各种空间关系(所以2个矩形),如:水平,垂直,对角线,近,远,重叠,包含等......
我必须在java中完成。
我已经知道这个库的存在: http://www.vividsolutions.com/jts/JTSHome.htm
但我不确定它能帮助我处理水平,垂直,对角线,近处和远处等关系。也许它可以帮助重叠并包含。
在我开始编写某种临时实现之前,我想问的是,是否有一些理论可以解决这个问题(当然我对如何实现这种关系有所了解,但也许我应该知道的事情。)
答案 0 :(得分:1)
您需要的是能够确定边界框之间的交叉点和距离。假设您有轴对齐的边界框(AABB,即框矩形边与轴平行),您可以将2D计算减少到1D间隔关系 - 分别计算x和y间隔之间的关系并组合它们。这种分而治之的策略应该大大简化逻辑。
这是一个可以用作起点的类。它是非常未经测试的,不应该用于生产代码 - 我知道它不适用于特殊情况,如空间隔(最小值>最大值)或单件间隔(最小值=最大值) - 但它应该可以帮到你继续前进。
null
一般来说,我发现非常有助于提供package stackoverflow;
public enum IntervalRelation
{
LEFT,
LEFT_TOUCHING,
OVERLAP_LEFT,
CONTAINING,
CONTAINED,
OVERLAP_RIGHT,
RIGHT_TOUCHING,
RIGHT;
public static double getIntervalDistance(
double min1, double max1,
double min2, double max2) {
double maxOfMin = Math.max(min1, min2);
double minOfMax = Math.min(max1, max2);
return maxOfMin - minOfMax;
}
public static IntervalRelation between(
double min1, double max1,
double min2, double max2) {
double dist = getIntervalDistance(min1, max1, min2, max2);
if (dist > 0) {
// not touching or intersecting
return min1 < min2? LEFT : RIGHT;
} else if (dist == 0) {
// touching
return min1 < min2? LEFT_TOUCHING : RIGHT_TOUCHING;
} else {
// overlapping or containment
if (min1 < min2) {
// overlap left or containing
return max1 < max2? OVERLAP_LEFT : CONTAINING;
} else {
return max1 < max2? CONTAINED : OVERLAP_RIGHT;
}
}
}
public static void main(String[] args) {
System.out.println(between( 0.0,+1.0, -2.0,-1.0));
System.out.println(between( 0.0,+1.0, +2.0,+3.0));
System.out.println(between( 0.0,+1.0, -2.0,+0.0));
System.out.println(between( 0.0,+1.0, +1.0,+3.0));
System.out.println(between( 0.0,+1.0, +0.5,+1.5));
System.out.println(between( 0.0,+1.0, -0.5,+0.5));
System.out.println(between( 0.0,+1.0, -0.5,+1.5));
System.out.println(between( 0.0,+1.0, +0.5,+0.6));
}
}
类,而不是总是必须提供最小/最大参数对,并且必须检查空白或单身性。