Java, операции масштабирования для растровых и векторных данных
Я хотел бы попросить вас помочь с кодом, включающим операции масштабирования с растровыми и векторными данными (представленными линией). Извините за полный код, который немного длиннее:
public class ZoomOperations extends JPanel {
private java.awt.image.BufferedImage image = null;
private Line2D.Double line = null;
private double scale = 1.0, sx = 0.0, sy = 0.0;
private int ratio = 20;
private MouseManager manager = null;
public ZoomOperations() throws IOException {
line = new Line2D.Double();
image = javax.imageio.ImageIO.read(new java.io.File("E:\\test.jpg"));
manager = new MouseManager(this);
addMouseListener(manager);
addMouseMotionListener(manager);
addMouseWheelListener(manager);
}
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform trans = g2.getTransform();
double x = 0.5*(getWidth() - scale * image.getWidth());
double y = 0.5*(getHeight() - scale * image.getHeight());
g2.translate(x, y);
g2.scale(scale, scale);
g2.drawImage(image, 0, 0, this);
g2.setTransform(trans); //Incorrect line?
g2.draw(line);
}
public void setPoints(Point start, Point end) { line.setLine(start, end); repaint();}
public void ZoomPlus() {scale = (++ratio + 2) / 10.0; repaint();}
public void ZoomMinus(){scale = (--ratio + 2) / 10.0; repaint();}
class MouseManager extends MouseAdapter {
ZoomOperations item;
Point start;
public MouseManager(ZoomOperations item_){item = item_;}
public void mousePressed(MouseEvent e){start = e.getPoint();}
public void mouseDragged(MouseEvent e){Point end = e.getPoint();
item.setPoints(start, end);
item.repaint();
}
public void mouseWheelMoved(MouseWheelEvent e){
int notches = e.getWheelRotation();
if (notches < 0) ZoomPlus();
else ZoomMinus();
}
}
public static void main(String[] args) throws IOException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ZoomOperations zoom = new ZoomOperations();
frame.add(zoom);
frame.setSize(new Dimension(800, 600));
frame.setVisible(true);
}
}
К сожалению, операция масштабирования применяется только к растровым данным. Векторная линия сохраняет свою позицию и размер.
Начальная фигура без увеличения:
Применение масштабирования плюс операция:
На мой взгляд, следующая строка, вероятно, неверна
g2.setTransform(trans);
накопленные сдвиги x, y и масштаб не задействованы... Однако ошибка может быть в другом месте:-)
Дополнительный вопрос: есть ли более простой способ реализовать операции масштабирования в Java? Большое спасибо за Вашу помощь...