2010-12-11 610 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