2010-12-11 3 views
1

일부 원의 영역을 제외하고 직사각형 영역을 계산합니다. 내가 region.getArea 같은 뭔가가 필요하지만- 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 회원이 C에서 RGNDATA stucture를 ++와 일치하는 바이트 []이다의 RegionData 당신을 돌려 줄 것입니다. 여기에는 겹치지 않는 직사각형 목록이있는 머리글이 있습니다. 영역 계산은 그 시점에서 단순한 for-loop가됩니다.

관심있는 분야가 모두있는 경우 그리기 위해 지역을 사용하지 않으려는 경우 이는 과잉입니다. 코드는 간단하지만 값 계산을 위해 더 많은 메모리와 컴퓨터 리소스를 사용하게 될 것입니다.

'mathy'방법으로 해결하면 특별한 경우가 많이 발생하지만 line-circle 교차 코드를 해결하면 너무 나쁘지 않아서 RegionData 및 DC의 모든 메모리 할당보다 빠를 것입니다. 문맥.

+0

+1, 나는 똑같은 것을 제안하려고했습니다. – casablanca

+0

예, 여러 교차로를 만드는 것이 좋습니다. + 1 – SDReyes

+0

지오메트리 클래스는이 경우에 더 적합합니다. http://msdn.microsoft.com/en-us/library/system.windows.media.geometry.aspx#inheritance 계속 하시겠습니까? – SDReyes

관련 문제