使用AWT,我使用java.awt.Graphics#drawOval
和java.awt.Graphics2D#setStroke
绘制了边框。对于设定的笔触尺寸大于椭圆形直径的情况,所产生的边框与预期的不同。在这种情况下,笔画与圆的另一侧的笔画重叠:圆的北笔画与南笔画重叠。 AWT以XOR方式呈现此重叠,如下图所示。
相反,我希望笔画重叠以“或”方式绘制,因此在所有情况下,stroke width > circle diameter
的中心都是黑色的。
有没有一种简单的方法可以将行为更改为“或”重叠模式,即使圆的宽度或高度(然后是椭圆)也不相等?
直径相同(10像素),且笔划宽度增大:
答案 0 :(得分:0)
基于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);
}
}
这是它的样子