2010-12-11 13 views
1

私は、いくつかの円の領域を除外してから、矩形の面積を計算しています。 これは私の現在のソリューションです:私は円を除いた面積を得るためにregion.getArea()のようなものを必要とするしかし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); 

System.Drawing.Region領域を計算する方法は知っていますか?

- または -

あなたには、いくつかの円を除いた矩形領域を計算する別の方法を知っていますか?

+0

なぜこのエリアが必要ですか?多分あなたがしようとしていることをやるよりよい方法があります。 – casablanca

+0

@ MerickOWAの回答は、一般的なケースでは最高の解決策です。しかし、円が重なっていないことがわかっていて、すべてが長方形内にある場合は、あなた自身でエリアを計算する簡単な数学を行うことができます。 – casablanca

答えて

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

Theresはこれを行うにはありません方法が、私の最高の推測では、GetRegionData機能がDataメンバーだRegionDataをあなたに戻って与えることであるC++からRGNDATA stuctureに一致するバイト[]です。そこには、オーバーラップしない矩形のリストがあるヘッダーがあります。面積を計算することは、その時点で単純なfor-loopになります。

あなたが関心を寄せている領域があり、描画用にリージョンを使用する予定がない場合は、おそらく過剰です。コードは単純ですが、価値計算にもっと多くのメモリとコンピュータリソースを使います。

「mathy」の方法では特殊なケースがたくさんあるかもしれませんが、ラインサークルの交差コードを解決すると、あまりにも悪くあってはならず、おそらくRegionDataとDCのすべてのメモリ割り当てよりも速くなるはずですコンテキスト。

+0

+1、私は同じことを提案しようとしていた。 – casablanca

+0

はい、複数の交差点を作ることは痛みになります。 + 1 – SDReyes

+0

ジオメトリクラスは、このケースにはもっと適しています:http://msdn.microsoft.com/en-us/library/system.windows.media.geometry.aspx#inheritanceContinuedあなたはどう思いますか? – SDReyes

関連する問題