【问题标题】:Unexpected circle border drawn with AWT使用 AWT 绘制的意外圆形边框
【发布时间】:2019-06-06 13:08:16
【问题描述】:

在 AWT 中,我使用 java.awt.Graphics#drawOvaljava.awt.Graphics2D#setStroke 绘制边框。对于设置笔划的大小大于椭圆直径的情况,生成的边框与预期的不同。在这种情况下,笔划与圆另一侧的笔划重叠:圆形北笔划与南笔划重叠。 AWT 以 XOR 方式呈现这种重叠,如下图所示。

相反,我希望笔画重叠以 OR 方式绘制,因此在所有情况下 stroke width > circle diameter 的中心都是黑色的。

是否有一种简单的方法可以将行为更改为 OR 重叠模式,即使圆的宽度或高度(然后是椭圆)不相等?

相同的直径(10px)随着笔画宽度的增加:

【问题讨论】:

  • 确实出乎意料。我从未注意到这一点,并将结果与​​drawRect 的结果进行比较,我几乎将其视为一个错误(尽管我认为它不会被归类为错误,因为它几乎不会被忽视)。我玩了一下,但没有找到合理的解决方法。 (最接近的可能是stackoverflow.com/a/35526341/3182664 中的草图,但应该仔细检查这是否是一个明智的解决方案......)

标签: java graphics awt geometry graphics2d


【解决方案1】:

基于 Marco13 在他的评论中提到的解决方案,我想出了这个自定义的 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);
    }
}

看起来是这样的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多