Graphics2D的旋转precision问题 [英] Graphics2D Rotation Precision Issues

查看:320
本文介绍了Graphics2D的旋转precision问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我画4层叠矩形,绕一个点在画布上,然后再次绘制相同的形状,但堆叠的矩形没有保持完全一致。

下面是截图:

正如你所看到的,第一不转动块是完美的,但下面的是对齐。为什么会出现这种情况,并哪能prevent呢?


SSCE

  //只需导入一切保持简短而亲切
进口java.awt中*。
导入的java.awt.geom *。
进口的javax.swing *。

@燮pressWarnings(串行)
公共类AlignmentIssue扩展JComponent的{
    @覆盖
    公共无效漆(图形G){
        Graphics2D的G2D =(Graphics2D的)克;
        双角= Math.toRadians(30);
        INT numRects =(INT)Math.floor(2.0 * Math.PI /角);
        矩形RECT =新的Rectangle(0,100,20,25);

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.translate(的getWidth()/ 2,的getHeight()/ 2);

        的for(int i = 0; I< numRects ++我){
            的AffineTransform变换= g2d.getTransform();

            为(中间体n = 0时; N 3; ++ n)的{
                g2d.draw(RECT);
                g2d.translate(0,rect.height);
            }

            g2d.setTransform(变换);
            g2d.rotate(角度);
        }
    }

    公共静态无效的主要(字串[] args){
        JFrame的框架=新的JFrame(对齐问题);

        frame.add(新AlignmentIssue());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.set preferredSize(新尺寸(800,600));
        frame.pack();
        frame.setLocationRelativeTo(空);
        frame.setVisible(真正的);
    }
}
 

解决方案

您需要更多的precise行程控制:

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

默认可以让几何形状变化了一下,根据实现。纯试图保持亚像素精度。

I am drawing 4 stacked rectangles, rotating the canvas about a point and then drawing that same shape again but the stacked rectangles aren't remaining completely aligned.

Here's a screenshot:

As you can see, the first, unrotated block is perfect but the following ones are misaligned. Why is this happening and how can I prevent it?


SSCE

//Just import everything to keep it short and sweet
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class AlignmentIssue extends JComponent {
    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        double angle = Math.toRadians(30);
        int numRects = (int)Math.floor(2.0 * Math.PI / angle);
        Rectangle rect = new Rectangle(0, 100, 20, 25);

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.translate(getWidth() / 2, getHeight() / 2);

        for(int i = 0; i < numRects; ++i) {
            AffineTransform transform = g2d.getTransform();

            for(int n = 0; n < 3; ++n) {
                g2d.draw(rect);
                g2d.translate(0, rect.height);
            }

            g2d.setTransform(transform);
            g2d.rotate(angle);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Alignment Issue");

        frame.add(new AlignmentIssue());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(800, 600));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

解决方案

You need more precise stroke control:

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

The default may let the geometry vary a bit, depending on the implementation. Pure tries to keep subpixel accuracy.

这篇关于Graphics2D的旋转precision问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆