为什么Region.IsEmpty()需要Graphics上下文?

时间:2013-06-24 21:44:44

标签: .net gdi+

我正在使用Region.IsEmpty()查看两个区域是否相交,但我真的不明白为什么必须提供Graphics上下文。

official description

  

图形上下文g的当前变换用于计算绘图表面上的区域内部。

两个维度中的哪个转换可能会分隔两个重叠区域,或者使非空区域变空?

这是粒度问题吗?别名与抗锯齿?

3 个答案:

答案 0 :(得分:4)

Region.IsEmpty(Graphics g)方法检查指定为g 的当前图形上下文是否包含占用特定区域的任何项目。

不一定要检查两个区域是否相交,而是一个区域是否在绘图表面上交叉任何其他项目。 Graphics实例允许Region对绘图表面执行检查,因为它被定义为Graphics。从某种意义上说,这种方法实际上就像[不工作代码] g.ContainsElementsWhichIntersect(theRegion)

答案 1 :(得分:4)

区域是GDI功能,与GDI设备上下文密切相关。您可以指定具有浮点数的区域,例如采用GraphicsPath或RectangleF的构造函数。但最终的计算是用整数精度完成的。对于像素精度来说已经足够好了,不再需要了。

从逻辑坐标到设备坐标(即像素)的映射由设备上下文的设置引导。其中可能具有1:1以外的映射模式。因此,一个像2.0 x 2.0的矩形区域一旦映射到像素就可能会变空。例如,请查看SetMapMode()

因此,当您打算将Regions用作一般工具时,请注意,特别是结果中缺乏精确度(不超过整数精度)可能会让您感到意外。

答案 2 :(得分:2)

从您的链接:

  

测试此Region在指定的内部是否为空   绘图表面。

该陈述中的执行术语是绘图表面。要拥有绘图表面,您需要一个图形上下文,因此需要一个Graphics对象的实例。

文档提到转换可能只是一些令人困惑的术语。这只是一种奇特的方式,表示返回值将在Graphic上下文的当前状态中保持为true。如果有任何变化,例如ScaleTransform甚至是一个vanilla DrawLine调用,那么就会出现“转换”,然后你的IsEmpty结果可能不再有效。

另外<如果内部某种矩阵变换实际应用于提供的Region坐标以检测“空白”,我不会感到惊讶。