我有一个类型为Rect
的矩形,用于定义某个对象的轮廓,另一个类型为Rect
的矩形,表示用户使用鼠标绘制的选择矩形以选择某些对象。现在,选择过程通过调用每个对象的以下方法对每个对象执行命中测试:
public override bool IntersectsWith(Rect selectionRect)
{
return this.Rectangle.IntersectsWith(selectionRect);
}
但是现在我的物品也有洞。一种类型的物体不仅仅包含一个矩形,而且还有其他矩形孔,不应考虑进行命中测试。
我的IntersectsWith
方法应如何执行此类命中测试? WPF在这里为我提供了哪些几何类?我知道Win32 API(或者它是Windows Forms?)有一个名为Region
的东西,我可以添加和剪切回合。 WPF类Polygon
看起来很有前景,但它是一个完全控制,对于简单的几何测试来说太重了。
我能想象的一个简单的解决方案肯定是错误的:我不能只是积极地测试主要轮廓,然后对所有孔矩形进行负面测试。因为如果选择矩形完全在这样的一个洞内,则命中测试将返回false。但是当选择矩形覆盖边界矩形内的孔和非孔区域时,即使触摸了一个洞,命中测试也将返回true。
答案 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)