2010-12-11 25 views
1

在计算排除某些圈子的面积后,我正在计算rectagle的面积。 这是我目前的解决方案:C# - 如何获取System.Drawing.Region的区域?

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区域吗?

- 或 -

你知道另一种方式来计算排除某些圈子后的矩形区域?

+0

你为什么需要该区域?也许有更好的方法去做任何你想做的事情。 – casablanca 2010-12-11 19:11:29

+0

@ MerickOWA的答案是一般情况下的最佳解决方案。但是,如果您知道这些圆圈不重叠并且都在矩形内,则可以通过一些简单的数学运算来自行计算该区域。 – casablanca 2010-12-11 19:21:36

回答

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

保持这样的结果一点,地区级的设计在图形代码中使用。只有具有匝道误差累积功能的像素才是准确的。 直径越大,相对误差越小。

3

世界上没有方法做到这一点,但我最好的猜测是,GetRegionData功能会给你回RegionData谁的Data成员是一个byte [],它从C RGNDATA stucture ++相匹配。在那里你有一个不重叠的矩形列表。计算面积将是一个简单的for循环。

如果该地区是你所有的感兴趣,你不打算使用该地区进行绘图,那么这可能是一个矫枉过正。代码我很简单,但你会用更多的内存和计算机资源进行值计算。

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

+0

+1,我会建议同样的事情。 – casablanca 2010-12-11 19:19:44

+0

是的,尽管多个交点成为一种痛苦。 + 1 – SDReyes 2010-12-11 19:28:31

+0

几何类看起来更适合这种情况:http://msdn.microsoft.com/en-us/library/system.windows.media.geometry.aspx#inheritanceContinued您怎么看? – SDReyes 2010-12-11 19:29:00