Неожиданная граница круга, нарисованная с помощью AWT - PullRequest
0 голосов
/ 11 января 2019

С AWT я рисую границу, используя java.awt.Graphics#drawOval и java.awt.Graphics2D#setStroke. Для ситуаций, когда заданный ход имеет размер больше диаметра овала, результирующая граница не соответствует ожидаемой. В этой ситуации штрих перекрывает штрих другой стороны круга: кружок северного хода перекрывает южный штрих. AWT отображает это перекрытие в формате XOR, как показано на следующем рисунке.

Вместо этого я ожидаю, что перекрытие штриха нарисовано ИЛИ способом, так что во всех ситуациях, когда stroke width > circle diameter центр является черным.

Есть ли простой способ изменить поведение на режим перекрытия ИЛИ, даже если ширина или высота круга (тогда это эллипс) не равна?

Тот же диаметр (10 пикселей) с увеличением ширины хода:

Same diameter (10px) with increasing stroke width

1 Ответ

0 голосов
/ 12 января 2019

Основываясь на решении, которое Марко13 упомянул в своем комментарии, я предложил эту пользовательскую функцию drawOval. Он в основном переключается с drawOval на fillOval, когда ширина хода больше диаметра. Положение и размеры для функции fillOval рассчитываются в соответствии с выводом drawOval.

public static void drawOval(Graphics2D g2d, int strokeWidth, int x, int y, int width, int height) {
    int minLength = Math.min(width, height);
    int maxLength = Math.max(width, height);
    if (minLength >= strokeWidth) {
        g2d.drawOval(x, y, width, height);
    } else {
        int x1 = x - (strokeWidth - maxLength) / 2 - (maxLength / 2);
        int y1 = y - (strokeWidth - maxLength) / 2 - (maxLength / 2);
        int width1 = width + strokeWidth;
        int height1 = height + strokeWidth;
        g2d.fillOval(x1, y1, width1, height1);
    }
}

Вот как это выглядит

enter image description here

...