.net 为什么Region.IsEmpty()需要图形上下文?

.net 为什么Region.IsEmpty()需要图形上下文?,.net,gdi+,.net,Gdi+,我正在使用Region.IsEmpty()查看两个区域是否相交,但我真的不明白为什么我必须提供图形上下文 警察说 图形上下文g的当前变换用于计算图形曲面上的区域内部 什么样的二维变换可能会将两个重叠区域分开,或使非空区域变为空 这是一个粒度问题吗?混叠与反混叠的比较?区域。IsEmpty(图形g)方法检查指定为g的当前图形上下文是否有任何占据特定区域的项 它不一定检查两个面域是否相交,而是检查一个面域是否与图形表面上的任何其他项相交。图形实例允许区域对绘图表面执行检查,因为这被定义为图形。从某种

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

警察说

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

什么样的二维变换可能会将两个重叠区域分开,或使非空区域变为空

这是一个粒度问题吗?混叠与反混叠的比较?

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

它不一定检查两个面域是否相交,而是检查一个面域是否与图形表面上的任何其他项相交。
图形
实例允许
区域
对绘图表面执行检查,因为这被定义为
图形
。从某种意义上说,这种方法实际上就像[不工作的代码]
g.containselements,它在您的链接中包含了intersect(区域)

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

该声明中的操作术语是绘图面。要拥有图形曲面,需要图形上下文,因此需要图形对象的实例

文档中提到的转换可能只是一些令人困惑的行话。这只是一种花哨的说法,表示返回值在图形上下文的当前状态下为真。如果有任何变化,比如ScaleTransform,甚至是一个普通的DrawLine调用,那么就会出现“转换”,然后您的IsEmpty结果可能不再有效


此外,如果在内部使用某种矩阵变换,并使用提供的区域坐标来检测“空性”,我也不会感到惊讶。

区域是GDI特征,与GDI设备上下文密切相关。您可以使用浮点数指定一个区域,就像采用GraphicsPath或矩形F的构造函数一样。但最终的计算是以整数精度完成的。像素精度刚刚好,不需要更多

从逻辑坐标到设备坐标(即像素)的映射受设备上下文设置的指导。其映射模式可能不是1:1。因此,一个矩形区域,比如说,2.0 x 2.0,一旦映射到像素,可能最终为空。例如,检查一下


因此,当您打算使用区域作为通用工具时,请务必注意,尤其是结果中缺少精度(不比整数精度好)可能会令人惊讶。

因此
区域
在某种意义上是
图形
的实用类吗?我遵循了(和其他地方)的建议,但这似乎不是当时的做法。@Zano你基本上必须把一个区域画成一个图形,然后检查第二个区域。这将为您提供一个“DoThiseIntersect”操作。除了图元文件图形上下文之外,图形上下文没有“包含项”或“包含元素”的概念。您绘制的内容将栅格化到位图图像或HDC上。您无法检查任何记录,以查看是否绘制了特定区域以生成当前位,或者该绘制是否由System.drawing而不是GDI或内存操作完成。考虑到这一点,你的答案毫无意义。