C# - 如何获取System.Drawing.Region的区域?

时间:2010-12-11 19:08:21

标签: c# .net-4.0 drawing system.drawing

在排除某些圆圈的区域后,我正在计算直肠的面积。 这是我目前的解决方案:

    var region = new Region( new Rectangle(0, 0, 10, 10) );
    var circle = new System.Drawing.Drawing2D.GraphicsPath();
    circle.AddEllipse(50, 50, 25, 25);
    // Exclude the circle from the region.
    region.Exclude(circle);

但是我需要像region.getArea()这样的东西来排除圆圈之后的区域。

您知道如何计算System.Drawing.Region区域吗?

-Or -

您是否知道在排除某些圆圈后计算矩形区域的另一种方法?

2 个答案:

答案 0 :(得分:4)

        float diam = 25;
        var region = new Region(new RectangleF(0, 0, diam, diam));
        var circle = new System.Drawing.Drawing2D.GraphicsPath();
        circle.AddEllipse(0, 0, diam, diam);
        region.Exclude(circle);

        var rects = region.GetRegionScans(new System.Drawing.Drawing2D.Matrix());
        float area = 0;
        foreach (var rc in rects) area += rc.Width * rc.Height;
        double realArea = diam * diam - Math.PI * diam * diam / 4;
        Console.WriteLine("Approx area = {0}, real area = {1}", area, realArea);

输出:约面积= 141,实际面积= 134.126147876595

记住这个结果,Region类被设计用于图形代码。它只对具有迂回误差累积的诀窍的像素准确。 diam 越大,相对误差越小。

答案 1 :(得分:3)

Theres没有这样做的方法,但我最好的猜测是GetRegionData函数会返回一个RegionData,其Data成员是一个byte [],它匹配来自C ++的RGNDATA结构。在那里你有一个标题,其中包含一个不重叠的矩形列表。在那时计算面积将是一个简单的for循环。

如果该区域是您感兴趣的,并且您不打算使用区域进行绘图,那么这可能是一种过度杀伤力。代码我很简单,但你会耗费更多的内存和计算机资源来进行价值计算。

解决它'mathy'方式可能涉及很多特殊情况,但是一旦解决了线圆交叉代码,它应该不会太糟糕,并且可能比RegionData和DC上下文的所有内存分配更快