2014-10-21 4 views
3

이미지에 최대 4 개의 사각형이 있습니다. 각 사각형의 왼쪽 상단 X, Y 좌표 및 너비, 높이를 알고 있습니다. 가장 왼쪽 상단 사각형에서 가장 하단 오른쪽 사각형까지의 크기를 가진 Int32Rect를 만들고 싶습니다. 주요 문제는 x, y, width, height 매개 변수로만 System.Windows.Int32Rect를 만들 수 있다는 것입니다. 어떤 방법을 사용하여 현재 알려진 값으로이 작업을 수행 할 수 있습니까?여러 사각형의 경계 사각형 가져 오기

편집 : 명확히하기 위해 이미지의 다른 모든 "사각형"의 크기 인 Int32Rect를 만들고 싶습니다. 따라서 하나의 큰 Int32Rect는 이미지의 왼쪽 상단에서 "사각형"부터 시작하여 이미지의 오른쪽 하단에있는 "사각형"으로 확장됩니다.

여기 하나의 구형이 작업을 수행하는 코드이다 : 도움말 및 아이디어 모두를위한

var topLeftOfBox = new Point(centerOfBoxRelativeToImage.X - Box.Width/2, 
       centerOfBoxRelativeToImage.Y - Box.Height/2); 
return new CroppedBitmap(originalBitmap, new Int32Rect(topLeftOfBox.X, topLeftOfBox.Y, Box.Width, Box.Height)); 

감사합니다, 나는 나를 위해 최선을 작동하는 Aybe의 답변을 발견했다.

+1

e 위쪽, 왼쪽, X, Y 및 폭과 높이. Int32Rect에 X, Y, Width 및 Height 매개 변수를 전달할 수 있기 때문에 문제가 표시되지 않습니다. –

+0

이것은 다소 사소한 최대/최소 계산으로 보입니다. 최선의 시도와 문제 설명을 게시 할 수 있습니까? – nvoigt

+0

@AaronHawkins 단일 사각형에 대해이 작업을 수행 할 수 있지만 여러 사각형에 대해이 작업을 수행하려고합니다. – invizion

답변

2

는 각 구형 X/Y 분/maxs을 잡고이 값에서 사각형을 구축해야합니다

using System.Linq; 
using System.Windows; 

internal class Class1 
{ 
    public Class1() 
    { 
     var rect1 = new Int32Rect(10, 10, 10, 10); 
     var rect2 = new Int32Rect(30, 30, 10, 10); 
     var rect3 = new Int32Rect(50, 50, 10, 10); 
     var rect4 = new Int32Rect(70, 70, 10, 10); 

     var int32Rects = new[] { rect1, rect2, rect3, rect4 }; 
     var int32Rect = GetValue(int32Rects); 
    } 

    private static Int32Rect GetValue(Int32Rect[] int32Rects) 
    { 
     int xMin = int32Rects.Min(s => s.X); 
     int yMin = int32Rects.Min(s => s.Y); 
     int xMax = int32Rects.Max(s => s.X + s.Width); 
     int yMax = int32Rects.Max(s => s.Y + s.Height); 
     var int32Rect = new Int32Rect(xMin, yMin, xMax - xMin, yMax - yMin); 
     return int32Rect; 
    } 
} 

결과 : 당신은 어떤 노력을 저장하고, 피할 수

{10,10,70,70} 
+1

오른쪽, 위쪽, 아래쪽, 예 : s.X + s.Width 대신 s.Right를 사용할 수도 있습니다. – Pedro77

0

질문이 다소 불투명하기 때문에 찾고자하는 것에 대해 내 이해를 말하면서 시작하겠습니다. 귀하의 질문을 읽으면서 직사각형 컬렉션이 있고 컬렉션의 모든 직사각형을 포함하는 가장 작은 사각형을 찾으려고합니다.

  • 구형 영역의 왼쪽 상단이 (X, Y)이고, 오른쪽 아래는 (X+Width, Y+Height)입니다 : 여기

    는이 작업을 수행하기 위해 알아야 할 것입니다.
  • 직사각형의 너비는 Right - Left입니다. 높이는 Bottom - Top입니다.

이제는 양을 쉽게 변환 할 수 있습니다. 나머지는 쉽습니다. 최소 상단 값, 최소 좌측 값, 최대 우측 값 및 최대 하단 값을 찾습니다. 위의 두 번째 글 머리표의 방정식에 해당 값을 입력하면 완료됩니다.

+0

질문을 올바르게 이해 했습니까? –

+0

예 David H., 귀하의 솔루션은 본인이 답을 표시 한 것과 본질적으로 동일합니다. - 고마워요 – invizion

0

가장 왼쪽/가장 맨 왼쪽/가장 오른쪽에있는 사각형에 대한 "세계 지식"에 관심이 있습니다.

public static class RectangleExtensions 
{ 
    public static Rectangle RectsGetBounds(this Rectangle rect, params Rectangle[] rects) 
    { 
     Rectangle rbase = rect; 

     for (int i = 0; i < rects.Length; i++) 
     { 
      rbase = Rectangle.Union(rbase, rects[i]); 
     } 

     return rbase; 
    } 

    public static Rectangle ControlsGetBounds(this Control cntrl, params Control[] cntrls) 
    { 
     return RectsGetBounds(cntrl.Bounds, cntrls.Select(c => c.Bounds).ToArray()); 
    } 
} 
관련 문제