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