如何在Win2D中旋转矩形

时间:2017-09-23 20:34:01

标签: animation uwp win2d

我正在寻找一种方法,使用Win2D围绕其中心点旋转矩形图像(或任何图像)。

此代码段来自Win2D画布的OnDraw方法:

var redBitMap = _images[1];
var yellowBitMap = _images[2];

var rect = new Rect(topLeft.X, topLeft.Y, _width, _height);
_drawingSession.DrawImage(redBitMap, rect);

ICanvasImage image = new Transform2DEffect
{
   Source = yellowBitMap,
   TransformMatrix = Matrix3x2.CreateRotation((float)(60 * Math.PI / 180)),
};
var sourceRect = image.GetBounds(_drawingSession);
_drawingSession.DrawImage(image, rect), sourceRect, 1, CanvasImageInterpolation.HighQualityCubic);

这种方法让我的图像旋转了60度,但图像最终被绘制在错误的坐标上,歪斜并小于预期的图像。

有趣的是,如果我改变矩形的大小使其为正方形(使高度与宽度相同),则图像不再倾斜。

Yellow hex over Red hex

在更多地考虑之后,这是正在发生的事情: Actually happening

因此,黄色矩形表示我想要旋转的图像(中心)60度。固定在左上角的红色矩形是旋转时发生的情况。大蓝框是创建的新矩形,由image.GetBounds语句决定。

当我尝试将图像绘制回原始坐标时,您可以从右侧图像中看到它导致图像倾斜和缩小,因为源矩形不再与目标的大小或形状相同矩形。

如果我的几何技能更好,我可以确定地计算新矩形的边界并将它们应用到画布上的正确位置。但是,自从高中数学以来,这已经太多年了。在一次性计算中,我确信我可以解决它 - 但是当源图像的形状可能会改变时不会。

2 个答案:

答案 0 :(得分:2)

这里有线索:

        var scaleFactor = rect.Height / rect.Width;

        ICanvasImage image2 = new ScaleEffect
        {
            Source = image,
            Scale = new Vector2((float)scaleFactor, 1)
        };

        args.DrawingSession.DrawImage(image2, rect, sourceRect, 1, CanvasImageInterpolation.HighQualityCubic);

粘贴此代码而不是最后一行。希望你能得到你想要的东西:)

enter image description here

当您尝试将一个矩形绘制到具有不同宽高比的另一个矩形时,会发生缩放(看起来像歪斜)。

答案 1 :(得分:0)

Jet,你的建议帮助我找到答案。我需要做的就是不使用ScaleEffect,但那是什么给了我所需的线索。最终的绘制图像需要考虑到变化的大小(与ScaleEffect大致相同的想法。这给我留下了以下代码行:

args.DrawingSession.DrawImage(image, new Rect(topLeft.X + (_width - sourceRect.Width)/2, topLeft.Y + (_height - sourceRect.Height)/2, sourceRect.Width, sourceRect.Height), sourceRect, 1, CanvasImageInterpolation.HighQualityCubic)