如何从边界框计算空间关系?

时间:2015-07-27 09:52:10

标签: java geometry computational-geometry graphics2d jts

假设我有一张带有某种数字的图像。用户可以通过在图周围绘制边界框来选择其中的2个。我想要做的是计算这两个边界框之间的各种空间关系(所以2个矩形),如:水平,垂直,对角线,近,远,重叠,包含等......

我必须在java中完成。

我已经知道这个库的存在: http://www.vividsolutions.com/jts/JTSHome.htm

但我不确定它能帮助我处理水平,垂直,对角线,近处和远处等关系。也许它可以帮助重叠并包含。

在我开始编写某种临时实现之前,我想问的是,是否有一些理论可以解决这个问题(当然我对如何实现这种关系有所了解,但也许我应该知道的事情。)

1 个答案:

答案 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)); } } 类,而不是总是必须提供最小/最大参数对,并且必须检查空白或单身性。