C# Несоответствия закругленных углов прямоугольника - PullRequest
0 голосов
/ 10 февраля 2020

Используя C# WinForms, у меня есть обычный ярлык, который я заполняю закругленными углами. Проблема, с которой я сталкиваюсь, заключается в том, что получающиеся углы не округляются последовательно.

Для простоты понимания я создал 4 метки с закругленными углами в диапазоне от 1 до 5. Я добавил один контур границы для метки для удобства видимости, но даже без единого контура результаты одинаковы. Я также увеличил изображения на этикетках, чтобы мы могли видеть углы более четко.

Используя радиус 1, вы можете четко видеть, что верхние углы соответственно закруглены, но нижние границы остаются квадратными.

Radius 1

При использовании радиуса 2 и 3 соответственно получается аналогичный выход внизу.

Radius 2 and 3 respectively

Используя радиус 4 и 5 соответственно, вы можете четко видеть несоответствия на всех углах.

Radius 4

Radius 5

Обычно, если бы у меня была этикетка небольшого размера, это не было бы слишком большой проблемой, но пользователь должен иметь возможность масштабирования, и тогда он выглядит просто уродливо, когда радиус увеличивается, и несоответствия отчетливо видны.

Код, который я использую для создания закрашенного прямоугольника, предположительно очень базовый c, как, например, взято из Как рисовать закругленные Прямоугольник

public static GraphicsPath draw_rectangle(Rectangle bounds, int radius)
    {
        int diameter = radius * 2;
        Size size = new Size(diameter, diameter);
        Rectangle arc = new Rectangle(bounds.Location, size);
        GraphicsPath path = new GraphicsPath();

        if (radius == 0)
        {
            path.AddRectangle(bounds);
            return path;
        }

        // top left arc  
        path.AddArc(arc, 180, 90);

        // top right arc  
        arc.X = bounds.Right - diameter;
        path.AddArc(arc, 270, 90);

        // bottom right arc  
        arc.Y = bounds.Bottom - diameter;
        path.AddArc(arc, 0, 90);

        // bottom left arc 
        arc.X = bounds.Left;
        path.AddArc(arc, 90, 90);

        path.CloseFigure();
        return path;            
    }

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

Ваша помощь и \ или объяснения приветствуются.

...