2016-05-31 6 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

スキュー - マトリックス式

Matrix3x2.CreateRotation(radiansX, radiansY, origin) 

Skewed image with incorrect bounding box

答えて

1

私はこの問題は何」であり、正確にわからないんだけどされているが、最もロバスを代表していないこれでバウンディングボックスのトン定義:

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/)だから、私はこの式が実際に正しいかもしれないと思う。奇妙なことに、それだけでは十分に大きく見えません。 –

関連する問題