对包含孔的矩形进行测试

时间:2014-11-18 12:29:03

标签: wpf geometry hittest

我有一个类型为Rect的矩形,用于定义某个对象的轮廓,另一个类型为Rect的矩形,表示用户使用鼠标绘制的选择矩形以选择某些对象。现在,选择过程通过调用每个对象的以下方法对每个对象执行命中测试:

public override bool IntersectsWith(Rect selectionRect)
{
    return this.Rectangle.IntersectsWith(selectionRect);
}

但是现在我的物品也有洞。一种类型的物体不仅仅包含一个矩形,而且还有其他矩形孔,不应考虑进行命中测试。

我的IntersectsWith方法应如何执行此类命中测试? WPF在这里为我提供了哪些几何类?我知道Win32 API(或者它是Windows Forms?)有一个名为Region的东西,我可以添加和剪切回合。 WPF类Polygon看起来很有前景,但它是一个完全控制,对于简单的几何测试来说太重了。

我能想象的一个简单的解决方案肯定是错误的:我不能只是积极地测试主要轮廓,然后对所有孔矩形进行负面测试。因为如果选择矩形完全在这样的一个洞内,则命中测试将返回false。但是当选择矩形覆盖边界矩形内的孔和非孔区域时,即使触摸了一个洞,命中测试也将返回true。

1 个答案:

答案 0 :(得分:1)

手动"这并不难做,即只编写自己的几何代码,而不是使用内置的东西。例如,这里有一些伪代码:

function intersectsWith(Shape s, Rectangle rect):
  if not s.outerBoundary.itersectsWidth(rect):
    return false
  for holeRect in s.innerHoles:
    if fullyContains(holeRect, rect):
      return false
  return true

# tests if r1 completely contains r2
function fullyContains(Rectangle r1, Rectangle r2):
  return (r1.x < r2.x && r1.y > r2.y &&
          r1.x + r1.width > r2.x + r2.width &&
          r1.y + r1.height > r2.y + r2.height)