栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

反向Java Graphics2D缩放和旋转坐标

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反向Java Graphics2D缩放和旋转坐标

如果保留

AffineTransform
在绘制图像时使用的副本,则可以使用
AffineTransform.inverseTransform(Point2D ptSrc,Point2D
ptDst)

将设备空间坐标转换回用户空间

编辑
:如果捕获当前

Graphics2D
绘画的变换,请当心将
Graphics2D
其重新用于同一窗口/面板的多个轻量级子项,因为这样变换将相对于父组件,而鼠标坐标将相对于父组件这个孩子。您需要捕获对
转换 所做的 更改 ,而不是其最终值。例:

import java.awt.BasicStroke;import java.awt.Color;import java.awt.Component;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.geom.AffineTransform;import java.awt.geom.NoninvertibleTransformException;import java.awt.image.BufferedImage;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import javax.imageio.ImageIO;import javax.swing.Box;import javax.swing.BoxLayout;import javax.swing.JComponent;import javax.swing.Jframe;public class Main {    public static void main(String[] args) throws MalformedURLException, IOException {        Jframe frame = new Jframe();        Box box = new Box(BoxLayout.Y_AXIS);        BufferedImage image = ImageIO.read(new URL("http://sstatic.net/so/img/logo.png"));        AffineTransform xfrm1 = AffineTransform.getScaleInstance(0.95, 1.25);        xfrm1.rotate(-0.3);        box.add(new ImageView(image, xfrm1));        AffineTransform xfrm2 = AffineTransform.getShearInstance(0.1, 0.2);        xfrm2.scale(1.3, 0.9);        box.add(new ImageView(image, xfrm2));        frame.add(box);        frame.pack();        frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);        frame.setVisible(true);    }}@SuppressWarnings("serial")class ImageView extends JComponent {    @Override    public void paintComponent(Graphics g) {        Graphics2D g2d = (Graphics2D) g;        try { paintXfrm = g2d.getTransform(); paintXfrm.invert(); g2d.translate(getWidth() / 2, getHeight() / 2); g2d.transform(xfrm); g2d.translate(image.getWidth() * -0.5, image.getHeight() * -0.5); paintXfrm.concatenate(g2d.getTransform()); g2d.drawImage(image, 0, 0, this);        } catch (NoninvertibleTransformException ex) { ex.printStackTrace();        }    }    @Override    public Dimension getPreferredSize() {        return new Dimension(image.getWidth() * 2, image.getHeight() * 2);    }    ImageView(final BufferedImage image, final AffineTransform xfrm) {        this.canvas = image.createGraphics();        canvas.setColor(Color.BLACK);        canvas.setStroke(new BasicStroke(3.0f));        this.image = image;        this.xfrm = xfrm;        addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) {     try {         mouseDownCoord = e.getPoint();         paintXfrm.inverseTransform(mouseDownCoord, mouseDownCoord);     } catch (NoninvertibleTransformException ex) {     } } @Override public void mouseExited(MouseEvent e) {     mouseDownCoord = null; }        });        addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) {     Point p = e.getPoint();     try {         paintXfrm.inverseTransform(p, p);         if (mouseDownCoord != null) {  canvas.drawLine(mouseDownCoord.x, mouseDownCoord.y, p.x, p.y);  for (Component sibling: getParent().getComponents()) {      sibling.repaint();  }         }         mouseDownCoord = p;     } catch (NoninvertibleTransformException ex) {         ex.printStackTrace();     } }        });    }    private Graphics2D canvas;    private BufferedImage image;    private AffineTransform xfrm;    private AffineTransform paintXfrm;    private Point mouseDownCoord;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469337.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号