【问题标题】:Why does Region.IsEmpty() need a Graphics context?为什么 Region.IsEmpty() 需要 Graphics 上下文?
【发布时间】:2013-06-24 21:44:43
【问题描述】:

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

official description

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

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

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

【问题讨论】:

    标签: .net gdi+


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 那么Region 在某种意义上是Graphics 的实用程序类吗?我遵循了stackoverflow.com/questions/3615326/…(和其他地方)的建议,但似乎这不是要走的路。
      • @Zano 您基本上必须将一个区域绘制成图形,然后检查第二个。这会给你一个“做这些相交”的操作。
      • 除了元文件图形上下文之外,没有“具有项目”或“包含元素”的图形上下文的概念。您绘制的东西被光栅化到位图图像或 HDC 上。没有记录可以检查以查看特定区域是否被绘制以产生当前位,或者绘制是由 System.Drawing 而不是 GDI 或内存操作完成的。考虑到这一点,您的回答没有任何意义。
      【解决方案3】:

      来自您的链接:

      测试这个 Region 在指定的地方是否有一个空的内部 绘图表面。

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

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

      另外

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 2013-09-12
        • 2016-02-02
        • 2017-06-20
        • 1970-01-01
        相关资源
        最近更新 更多