繁体   English   中英

用AWT绘制意外的圆形边框

[英]Unexpected circle border drawn with AWT

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

相反,我期望的是笔触重叠是以“或”方式绘制的,因此在所有情况下,当stroke width > circle diameter ,中心都是黑色。

即使圆的宽度或高度(然后是椭圆)不相等,我是否可以通过简单的方法将行为更改为“或”重叠模式?

直径相同(10px),且笔划宽度增加:

直径相同(10px),笔划宽度增加

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

看起来像这样

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM