2016-05-31 4 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, который я могу использовать?

Поворот - Матрица формула

Matrix3x2.CreateRotation(radians, origin) 

Rotated image with correct bounding box

Skew - Матрица формула

Matrix3x2.CreateRotation(radiansX, radiansY, origin) 

Skewed image with incorrect bounding box

ответ

1

Я не уверен, что именно то, что проблема с чем ты» но он не представляет собой наиболее robus т определение ограничивающего параллелепипеда, который это:

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

Я думаю, что мы оба возвращаются тот же результат, который соответствует тест JavaScript [здесь] (http://jsfiddle.net/jamessouth/53302x4w/embedded/) Так Я думаю, что эта формула может быть правильной. Как ни странно, это просто не кажется достаточно большим. –

Смежные вопросы