将矩阵平移到中心并适合矩形

时间:2018-08-26 12:03:58

标签: xamarin matrix skia skiasharp

我使用SkiaSharpSKCanvas上绘制一些SKRect。我正在尝试为绘图区域实现“缩放以适合和居中”功能。我使用以下代码来计算所有SKRect的边界框。

private SKRect GetBoundingBox()
{
    int xMin = AllRectangles.Min(s => (int)s.Left);
    int yMin = AllRectangles.Min(s => (int)s.Top);
    int xMax = AllRectangles.Max(s => (int)s.Right);
    int yMax = AllRectangles.Max(s => (int)s.Bottom);
    SKRect result = new SKRect(xMin, yMin, xMax, yMax);
    return result;
}

现在,我要转换在PaintSurface期间使用的SKMatrix,以使边界框居中(包含其中的所有项)并缩放边界框以适合SKCanvasView。我有一个GIF,可以显示Photoshop中的“导航器视图”,可以完成我要构建的工作。 Navigator

1 个答案:

答案 0 :(得分:1)

我终于找到了解决问题的方法,并且我想分享我的代码,以帮助可能遇到类似问题的其他人。 以下方法计算矩阵的比例以适合视口。比例因子和视口矩形的平移都应用于矩阵。完成此操作后,需要重新绘制画布。

public void CenterAndFitRectangle(SKRect viewport)
{
    var viewPortRectangle = _currentMatrix.MapRect(viewport);
    var scale = Math.Min(CanvasView.Bounds.Width / viewPortRectangle.Width, CanvasView.Bounds.Height / viewPortRectangle.Height);
    _currentMatrix.ScaleX = scale;
    _currentMatrix.ScaleY = scale;
    _currentMatrix.TransX = -viewPortRectangle.Left * scale
    _currentMatrix.TransY = -viewPortRectangle.Top * scale;
}