Graphics2D线条和形状绘图问题(在错误的位置渲染)

时间:2017-01-27 17:59:14

标签: java swing graphics graphics2d custom-painting

我使用Graphics2D绘制了三个箭头。

  1. drawLine s
  2. draw(Shape)
  3. fill(Shape)
  4. 这是放大的样子:

    drawn arrows

    我无法理解两件事:

    1. 为什么填充的那个变小了?
    2. 其次,为什么箭头1.和3.看起来不一样?两者都包括3条抗锯齿线。它们(可能)不应仅仅在顶点上有所区别吗?
    3. 以下是整个代码:

      import javax.swing.*;
      import java.awt.*;
      
      public class ShapeTest extends JPanel
      {
          public static void main(String [] args)
          {
              JFrame frame = new JFrame();
              frame.setSize(new Dimension(220, 200));
              frame.add(new ShapeTest());
              frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
              frame.setVisible(true);
          }
      
          @Override
          protected void paintComponent(Graphics graphics)
          {
              super.paintComponent(graphics);
      
              Graphics2D graphics2D = (Graphics2D)graphics;
      
              graphics.setColor(Color.white);
              graphics.fillRect(0, 0, this.getWidth(), this.getHeight());
      
              graphics2D.setColor(Color.black);
              graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
              graphics2D.drawLine(100, 40, 103, 46);
              graphics2D.drawLine(103, 46, 106, 40);
              graphics2D.drawLine(100, 40, 106, 40);
      
              graphics2D.fill(new Polygon(
                      new int[]{100, 103, 106},
                      new int[]{50, 56, 50},
                      3
              ));
      
              graphics2D.draw(new Polygon(
                      new int[]{100, 103, 106},
                      new int[]{60, 66, 60},
                      3
              ));
          }
      }
      

1 个答案:

答案 0 :(得分:2)

我似乎找到了问题的答案。我将它们发布给可能面临同样问题的其他人。

较小,因为正如MadProgrammer在问题下方的评论中所说,沿着中间的边缘绘制了stokes,因此1px笔划边缘将为0.5px形状边缘的一面。

由于四舍五入,

移位。当您使用浮点精度坐标绘制线时,可以在某些平台上以某种方式对其进行标准化。在Windows上,至少对于Path2D.FloatLine2D.Float,它会将coords舍入为整数。我想同样适用于fill(Shape)。 Fotrunatelly,您可以通过以下方式禁用笔划规范化:

g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

它解决了这个问题:

arrows

不同,因为渲染算法不同。