我Region.IsEmpty()
用来查看两个区域是否相交,但我真的不明白为什么我必须提供Graphics
上下文。
官方描述 说
图形上下文 g 的当前变换用于计算绘图表面上的区域内部。
什么样的二维变换可以分离两个重叠的区域,或者使非空区域为空?
是粒度问题吗?锯齿与抗锯齿的区别?
该Region.IsEmpty(Graphics g)
方法检查指定为 g 的当前图形上下文是否有任何占据特定区域的项目。
不一定要检查两个区域是否相交,而是检查一个区域是否与绘图表面上的任何其他项目相交。该Graphics
实例允许Region
对绘图表面执行检查,因为这被定义为Graphics
. 从某种意义上说,这种方法真的很像 [not working code] g.ContainsElementsWhichIntersect(theRegion)
。
区域是 GDI 功能,与 GDI 设备上下文密切相关。您可以使用浮点数指定区域,例如采用 GraphicsPath 或 RectangleF 的构造函数。但是最终的计算是以整数精度完成的。对像素精度来说足够好,不需要更多。
从逻辑坐标到设备坐标(即像素)的映射由设备上下文的设置指导。它可能具有 1:1 以外的映射模式。因此,一个 2.0 x 2.0 的矩形区域在映射到像素后可能最终为空。例如,查看SetMapMode()。
因此,当您打算将 Regions 用作通用工具时,请务必注意,尤其是结果中缺乏精度(不比整数精度更好)可能会让人感到意外。
从您的链接:
测试此区域在指定绘图表面上是否具有空的内部。
该语句中的操作术语是绘图表面。要拥有绘图表面,您需要一个图形上下文,因此需要一个 Graphics 对象的实例。
文档中提到的转换可能只是一些令人困惑的行话。这只是一种奇特的说法,即返回值将在 Graphic 上下文的当前状态下成立。如果发生任何变化,例如 ScaleTransform 甚至是普通的 DrawLine 调用,那么就会发生“转换”,然后您的 IsEmpty 结果可能不再有效。
另外<如果在内部实际应用某种矩阵变换并提供区域坐标来检测“空”,我不会感到惊讶。