6

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

官方描述 说

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

什么样的二维变换可以分离两个重叠的区域,或者使非空区域为空?

是粒度问题吗?锯齿与抗锯齿的区别?

4

3 回答 3

4

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

不一定要检查两个区域是否相交,而是检查一个区域是否与绘图表面上的任何其他项目相交。Graphics实例允许Region对绘图表面执行检查,因为这被定义为Graphics. 从某种意义上说,这种方法真的很像 [not working code] g.ContainsElementsWhichIntersect(theRegion)

于 2013-06-24T21:48:51.710 回答
4

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

从逻辑坐标到设备坐标(即像素)的映射由设备上下文的设置指导。它可能具有 1:1 以外的映射模式。因此,一个 2.0 x 2.0 的矩形区域在映射到像素后可能最终为空。例如,查看SetMapMode()

因此,当您打算将 Regions 用作通用工具时,请务必注意,尤其是结果中缺乏精度(不比整数精度更好)可能会让人感到意外。

于 2013-06-24T22:32:21.193 回答
2

从您的链接:

测试此区域在指定绘图表面上是否具有空的内部。

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

文档中提到的转换可能只是一些令人困惑的行话。这只是一种奇特的说法,即返回值将在 Graphic 上下文的当前状态下成立。如果发生任何变化,例如 ScaleTransform 甚至是普通的 DrawLine 调用,那么就会发生“转换”,然后您的 IsEmpty 结果可能不再有效。

另外<如果在内部实际应用某种矩阵变换并提供区域坐标来检测“空”,我不会感到惊讶。

于 2013-06-24T22:01:41.587 回答