2016-05-31 2 views
0

변환 된 사각형의 경계 상자를 계산하는 데 다음 알고리즘을 사용하고 있지만 문제가있는 것으로 보입니다.System.Numerics를 사용하여 변형 된 사각형의 경계 상자를 올바르게 계산하십시오.

public static Rectangle GetBoundingRectangle(Rectangle rectangle, Matrix3x2 matrix) 
{ 
    Vector2 leftTop = Vector2.Transform(new Vector2(rectangle.Left, rectangle.Top), matrix); 
    Vector2 rightTop = Vector2.Transform(new Vector2(rectangle.Right, rectangle.Top), matrix); 
    Vector2 leftBottom = Vector2.Transform(new Vector2(rectangle.Left, rectangle.Bottom), matrix); 
    Vector2 rightBottom = Vector2.Transform(new Vector2(rectangle.Right, rectangle.Bottom), matrix); 

    Vector2 min = Vector2.Min(Vector2.Min(leftTop, rightTop), Vector2.Min(leftBottom, rightBottom)); 
    Vector2 max = Vector2.Max(Vector2.Max(leftTop, rightTop), Vector2.Max(leftBottom, rightBottom)); 

    return new Rectangle(0, 0, (int)(max.X - min.X), (int)(max.Y - min.Y)); 
} 

이 기능은 회전에는 적합하지만 기울이기에는 적합하지 않습니다. 아래 이미지에서 볼 수 있듯이 수식에서 계산 된 사각형이 너무 작습니다. 누구든지 문제가 무엇인지 파악하거나 이미 사용할 수있는 System.Numerics 네임 스페이스 내에 메서드가 있습니까?

회전 - 매트릭스 공식

Rotated image with correct bounding box

Matrix3x2.CreateRotation(radians, origin) 
기울이기 - 매트릭스 공식

Matrix3x2.CreateRotation(radiansX, radiansY, origin) 

Skewed image with incorrect bounding box

답변

1

나는 문제가 당신 것과 정확히 모르겠어요 ' 했어.하지만 가장 로버스를 대표하지는 않아. 이있는 경계 상자의 t 정의 :

var allCorners = new List<Vector2> { leftTop, rightTop, leftBottom, rightBottom }; 
var xExtent = allCorners.Select(v => v.X).Max() - allCorners.Select(v => v.X).Min(); 
var yExtent = allCorners.Select(v => v.Y).Max() - allCorners.Select(v => v.Y).Min(); 
return new Rectangle(0, 0, xExtent, yExtent); 
+0

나는 우리가 모두 자바 스크립트 테스트를 [여기] 일치하는 동일한 결과를 반환하는 생각 (http://jsfiddle.net/jamessouth/53302x4w/embedded/) 그래서 수식이 실제로 맞다고 생각합니다. 이상하게도 충분히 커 보이지는 않습니다. –

관련 문제