Переведите матрицу в центр и поместите прямоугольник - PullRequest
0 голосов
/ 26 августа 2018

Я использую SkiaSharp, чтобы нарисовать немного SKRect на SKCanvas. Я пытаюсь реализовать функциональность «масштабировать, чтобы подогнать и отцентрировать» для области рисования. Я использовал следующий код для вычисления ограничивающей рамки для всех SKRect s.

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;
}

Теперь я хочу перевести SKMatrix, используемый во время PaintSurface, чтобы отцентрировать ограничивающий прямоугольник (со всеми элементами в нем) и масштабировать ограничивающий прямоугольник так, чтобы он соответствовал SKCanvasView. У меня есть GIF, который показывает представление навигатора в Photoshop, делая то, что я пытаюсь построить. Navigator

1 Ответ

0 голосов
/ 04 декабря 2018

Я наконец нашел решение своей проблемы и хотел поделиться своим кодом, чтобы помочь другим, которые могут бороться с подобной проблемой. Следующий метод вычисляет масштаб для матрицы, чтобы соответствовать области просмотра. И коэффициент масштабирования, и трансляция прямоугольника области просмотра применяются к матрице. После этой операции требуется перерисовка холста.

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;
}
...