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)
スキュー - マトリックス式
Matrix3x2.CreateRotation(radiansX, radiansY, origin)
私たちは、両方のJavaScriptのテストを[こちら]と一致し、同じ結果を返していると思う(http://jsfiddle.net/jamessouth/53302x4w/embedded/)だから、私はこの式が実際に正しいかもしれないと思う。奇妙なことに、それだけでは十分に大きく見えません。 –