如何在Win2D中旋转矩形

问题描述 投票:2回答:2

我正在寻找一种方法,使用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语句决定。

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

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

animation uwp win2d
2个回答
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

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


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)
© www.soinside.com 2019 - 2024. All rights reserved.