Масштабируйте рисунок, чтобы он соответствовал целевой области в C#

Многие программы рисования должны масштабировать чертеж, чтобы он соответствовал целевой области, либо с растяжкой, либо без нее. Следующий метод MapDrawing преобразует объект Graphics, поэтому он сопоставляет прямоугольник чертежа с прямоугольником на объекте Graphics.

// Сопоставьте прямоугольник с координатами чертежа
// прямоугольник графического объекта.
private void MapDrawing(Graphics gr, RectangleF drawing_rect,
    RectangleF target_rect, bool stretch)
{
    gr.ResetTransform();

    // Центрируем область рисования в начале координат.
    float drawing_cx = (drawing_rect.Left + drawing_rect.Right) / 2;
    float drawing_cy = (drawing_rect.Top + drawing_rect.Bottom) / 2;
    gr.TranslateTransform(-drawing_cx, -drawing_cy);

    // Масштаб.
    // Получаем масштабные коэффициенты для обоих направлений.
    float scale_x = target_rect.Width / drawing_rect.Width;
    float scale_y = target_rect.Height / drawing_rect.Height;
    if (!stretch)
    {
        // Чтобы сохранить соотношение сторон,
        // используйте меньший масштабный коэффициент.
        scale_x = Math.Min(scale_x, scale_y);
        scale_y = scale_x;
    }
    gr.ScaleTransform(scale_x, scale_y,
        System.Drawing.Drawing2D.MatrixOrder.Append);

    // Переходим в центр по области рисования.
    float graphics_cx = (target_rect.Left + target_rect.Right) / 2;
    float graphics_cy = (target_rect.Top + target_rect.Bottom) / 2;
    gr.TranslateTransform(graphics_cx, graphics_cy,
        System.Drawing.Drawing2D.MatrixOrder.Append);
}

Код начинается с сброса преобразований объекта Graphics для удаления любых предыдущих преобразований.

Далее код находит центр прямоугольника чертежа и преобразует его, чтобы он был центрирован в начале координат. Затем, когда код масштабирует чертеж на следующем шаге, он остается центрированным в начале координат.

Затем код масштабирует чертеж. Сначала он находит масштабные коэффициенты, которые заставляют рисунок заполнять целевую область вывода. Тогда, если параметр stretch false, указывая на то, что вы не хотите растягивать результат, код устанавливает оба масштабных коэффициента на меньший из двух. Это делает результат как можно большим, не искажая его.

Затем код масштабирует чертеж. Сначала он находит масштабные коэффициенты, которые заставляют рисунок заполнять целевую область вывода. Тогда, если параметр stretch false, указывая на то, что вы не хотите растягивать результат, код устанавливает оба масштабных коэффициента на меньший из двух. Это делает результат как можно большим, не искажая его.

...

В этот момент объект Graphics настроен, чтобы сделать чертеж в его конечном масштабе с центром в начале координат. Теперь код добавляет преобразование для перемещения центра чертежа (начало координат) в центр целевой области. Снова обратите внимание, что код добавляет это преобразование.

После использования этого метода для применения этих преобразований к объекту Graphics все, что вы рисуете на нем, будет соответствующим образом отображено на целевой прямоугольник.

Следующий код показывает, как программа использует метод MapDrawing для рисования изображения, показанного выше.

// Рисуем некоторые смайлики.
private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = 
        System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    RectangleF smiley_rect = new RectangleF(-1, -1, 2, 2);
    float wid = (this.ClientSize.Width - 1) / 2;
    float hgt = (this.ClientSize.Height - 1) / 2;

    // Рисуем в верхнем левом углу.
    MapDrawing(e.Graphics, smiley_rect,
        new RectangleF(0, 0, wid, hgt), false);
    DrawSmiley(e.Graphics);

    // Рисуем в левом нижнем углу.
    MapDrawing(e.Graphics, smiley_rect,
        new RectangleF(0, hgt, wid, hgt), false);
    DrawSmiley(e.Graphics);

    // Рисуем в правой части.
    MapDrawing(e.Graphics, smiley_rect,
        new RectangleF(wid, 0, wid, 2 * hgt), true);
    DrawSmiley(e.Graphics);
}

Метод DrawSmiley использует эллипсы и дугу для рисования смайлинки в области (-1, -1) - (1, 1). Это просто, поэтому здесь не показано. Загрузите пример, чтобы увидеть, как он работает.

Обработчик событий Paint RectangleF с именем smiley_rect, чтобы представить область, в которой должен быть нарисован смайлик. Он также делает переменные wid и hgt для измерения половины клиентской области формы (минус 1, так что вещи подходят по краям).

Источник: http://csharphelper.com/blog/2014/11/scale-a-drawing-so-it-fits-a-target-area-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector