使用Java绘制对角线

4

I have the following code:

private _x,_y,_w,_h;
protected void paintComponent( Graphics g_ ) {
  g_.setStroke( new BasicStroke(2) );

  g_.drawLine(_x, _y, _x+_w, _y+_h);
  g_.drawLine(_x, _y+_h, _x+_w, _y);
}

在我的情况下,我正在画一个正方形的对角线,所以:_w == _h。
我的问题是这两条线的表面厚度不同:第一条线看起来比第二条线粗。当检查实际绘制的像素时,渲染的差异如下所示:
我并不真的在乎哪个应该被认为是“正确”的(虽然我想了解这个结果的原因),但我希望有些连贯性,在这里两条线都有相同的渲染:我该怎么做?
(当我使用1px描边时,两条线之间没有区别)。
关于Olavi的回答的后续:
使用奇数像素的描边并不能解决问题:
启用抗锯齿会导致另一个问题:在绘制十字架的正方形的描边变模糊了。

  1. 为了更快地获得帮助,请发布一个SSCCE/MCVE,即一个简短、可运行、可编译的问题描述。
  2. 在官方的Oracle教程Graphics2D中有很好的解释。
- mKorbel
1个回答

5

基本上你有两个选择:

  1. 使用奇数像素的厚度
  2. 使用抗锯齿

就我个人而言,我更喜欢抗锯齿,因为它很漂亮,我喜欢漂亮的事物。然而,要解释为什么2像素宽度的线条会这样表现:Java不知道是用第一种方式还是第二种方式来画线(我无法确切地解释它为什么会做出这样的行为,但这是我看到的)。为了进一步说明这个答案,请尝试将另一条线向左或向右移动一个像素:这应该会导致两条具有相同厚度的线。

要使用抗锯齿,请按照以下步骤操作(未经测试的代码!)。 代码摘自这里

Graphics2D graphics2D = (Graphics2D) g_;

graphics2D.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

graphics2D.drawLine(_x, _y, _x+_w, _y+_h);
graphics2D.drawLine(_x, _y+_h, _x+_w, _y);

谢谢,但这些解决方案都不理想(我编辑了帖子以作进一步说明)。此外,将行向左或向右移动一个像素并没有改变任何东西。 - gregseth
@gregseth 我很惊讶奇数宽度对你不起作用。虽然我不敢公开说,但这可能实际上是Java中的一个错误。一个即时的解决方案是在一起绘制n个1像素宽的对角线,其中n是最终所需的描边宽度。请注意,在您提供的第一张图片中,从左下到右上的线是正确绘制的线;另一条线实际上具有3个描边宽度。 - Olavi Mustanoja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接