为什么在java中使用仿射变换会使图形变小

jgzswidk  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(148)

我对仿射变换还很陌生,我发现有一些事情很令人沮丧。。
我一直在做一个在屏幕上画激光的个人项目。我使用radialgradientpaint类来绘制激光的辉光,然后使用缩放和旋转仿射变换来更改椭圆的形状,并将激光转向特定的方向。
当我尝试旋转图形(没有缩放)时,它似乎会缩小它,我不知道这是为什么。我试过查这个但没用。也许我误解了这个类上的javadoc。为什么会这样?
我也很好奇如何让变换后的对象移动到与未变换图形相同的位置。即使坐标相同,两个图形也会移动到不同的位置。我知道这可能是因为仿射变换移动了整个图形,我可能需要将变换后的图形转换到与未变换图形相同的位置,但我不确定如何处理这个问题。
以下是我的代码中绘制激光的部分:

public void render(Graphics g) {

        // If the graphic is visible on the frame, draw it
        if(onScreen()) {

            Graphics2D g2d = (Graphics2D) g;

            // Preserves the original presets of the program's graphics
            AffineTransform ogTransform = g2d.getTransform();
            Shape ogClip = g2d.getClip();

            Point2D center = new Point2D.Float(x, y);
            float[] dist = {0.3f, 0.9f};
            Color[] colors = {new Color(1.0f, 1.0f, 1.0f, 0.9f), new Color(0.0f, 1.0f, 0.0f, 0.1f)};
            g2d.setPaint(new RadialGradientPaint(center, radius, dist, colors));

            AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleY);
            AffineTransform rotationTransform = AffineTransform.getRotateInstance(angle, x + width/2f, y + height/2f);

            // Transforms the shape to look more like a laser
            rotationTransform.concatenate(scaleTransform);
            g2d.setTransform(rotationTransform);

            // Draws a "cut-out" of the rectangle
            g2d.setClip(new Ellipse2D.Double(x - radius, y - radius, radius * 2, radius * 2));
            g2d.fillRect(x - radius, y - radius, radius * 2, radius * 2);

            // Default transformation and clip are set
            g2d.setTransform(ogTransform);
            g2d.setClip(ogClip);

            // Outlines where the transformed graphic should be
            g.setColor(Color.orange);
            g.drawRect(x - 10, y - 10, 20, 20);

        }
    }

感谢您的帮助!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题