我正在使用Region.IsEmpty()
查看两个区域是否相交,但我真的不明白为什么必须提供Graphics
上下文。
图形上下文g的当前变换用于计算绘图表面上的区域内部。
两个维度中的哪个转换可能会分隔两个重叠区域,或者使非空区域变空?
这是粒度问题吗?别名与抗锯齿?
答案 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坐标以检测“空白”,我不会感到惊讶。