当前位置: 首页 > 面试题库 >

AffineTransform:从其中心缩放一个Shape

袁康裕
2023-03-14
问题内容

我正在尝试使用AffineTransform从其中心缩放矩形。我敢肯定解决方案是显而易见的,但我无法使它起作用!到目前为止,这是我测试过的…

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Test extends JPanel {
    Test()
        {
        super(null);
        setOpaque(true);
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(200,200));
        }
    @Override
    protected void paintComponent(Graphics g1) {
        super.paintComponent(g1);
        Rectangle r= new Rectangle(5,5,getWidth()-10,getHeight()-10);
        double cx= r.getCenterX();
        double cy= r.getCenterY();
        Graphics2D g=(Graphics2D)g1;
        g.setColor(Color.BLACK);
        AffineTransform old= g.getTransform();
        for(double zoom=0.9; zoom>=0.5; zoom-=0.1)
            {
            AffineTransform tr2= new AffineTransform(old);
            tr2.translate(-cx, -cy);
            tr2.scale(zoom, zoom);
            tr2.translate(cx/zoom,cy/zoom);
            g.setTransform(tr2);
            g.draw(r);
            g.setTransform(old);
            }
        }


    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null, new Test());
        }
    }

但这是行不通的。


问题答案:

当您处理矩形时,我明白了您的意思。原因是因为转换的初始计算未考虑容器对象的大小。

使用此代替:

tr2.translate(
    (this.getWidth()/2) - (r.getWidth()*(zoom))/2,
    (this.getHeight()/2) - (r.getHeight()*(zoom))/2
);
tr2.scale(zoom,zoom);
g.setTransform(tr2);

这样做是在将矩形缩放之前将其平移到面板的中心。在我的测试中,它工作正常。



 类似资料:
  • 问题内容: 我正在尝试缩放/翻译java.awt。使用 AffineTransform 进行 造型 ,以便以定义的边界Rectangle进行绘制。 此外,我想在具有“ zoom ”参数的绘图区域中进行绘制。 我尝试了AffineTransform的各种串联,但是找不到正确的序列。例如,以下解决方案是错误的: 关于正确的AffineTransform有任何想法吗? 非常感谢 皮埃尔 问题答案: 需要

  • 问题内容: 所以我的问题是我有一个图片,并将其CSS设置为 它以较低的分辨率缩放(如下面的小提琴所示)。我想要的是使过渡从图像的中心生效。 目前; 从我在大多数涉及规模的过渡中所见,它们从左上角开始扩展。 问题答案: 只需替换为on即可。

  • 问题内容: 我希望能够放大HTML 5画布中鼠标下方的点,例如Google Maps上的。我该如何实现? 问题答案: 终于解决了: 关键是计算轴位置,以便缩放点(鼠标指针)在缩放后保持在同一位置。 最初,鼠标与角之间有一段距离,我们希望鼠标下方的点在缩放后保持在同一位置,但这是远离角的地方。因此,我们需要移动(角的坐标)以解决此问题。 然后,其余代码需要应用缩放并转换到绘制上下文,以便其原点与画布

  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 我试图从JSON中提取值,并将其存储在String List中,因为稍后我需要检查我在csv文件中的值是否存在于此List中。 任何人都可以帮我建立一个路径来提取它吗? 现在我在我的控制台上得到了这个。**(它只返回了十个,因为我更改了“limit”参数。 我的代码直到现在: 下面您可以找到JSON结构,我只需要对象“标识符”数组中的所有“accountId”。