Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 对带有孔的矩形进行命中测试_Wpf_Geometry_Hittest - Fatal编程技术网

Wpf 对带有孔的矩形进行命中测试

Wpf 对带有孔的矩形进行命中测试,wpf,geometry,hittest,Wpf,Geometry,Hittest,我有一个Rect类型的矩形,它定义了某个对象的轮廓,还有一个Rect类型的矩形,它表示用户用鼠标绘制的选择矩形,以选择某些对象。选择过程现在通过调用每个对象的以下方法对每个对象执行命中测试: public override bool IntersectsWith(Rect selectionRect) { return this.Rectangle.IntersectsWith(selectionRect); } 但现在我的物体上也有洞。一种类型的物体不仅由矩形组成,而且还有其他不应考

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

public override bool IntersectsWith(Rect selectionRect)
{
    return this.Rectangle.IntersectsWith(selectionRect);
}
但现在我的物体上也有洞。一种类型的物体不仅由矩形组成,而且还有其他不应考虑用于命中试验的矩形孔

我的IntersectsWith方法执行这样的命中测试应该是什么样子?WPF在这里为我提供了哪些几何课程?我知道是Win32 API还是Windows窗体?有一个叫做区域的东西,我可以在其中添加和剪切重角。WPF类多边形看起来很有希望,但它是一个完整的控件,对于一个简单的几何体测试来说太重了


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

这并不难手工完成,也就是说,只需编写自己的几何代码,而不必使用内置的东西。例如,下面是一些伪代码:

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)

这篇文章可能会有帮助:。是的,但我这里没有UIElements。这是画图,我需要自己做。此外,点击测试与这里的绘图不匹配,因为我需要在某些情况下对点击无反应的视觉部分。谢谢,这非常有效!WPF Rect类已经有了这些IntersectsWithRect和ContainesRect方法,所以它的代码非常短。