【发布时间】:2019-08-19 20:47:54
【问题描述】:
我目前正在使用 Java 进行一个项目,我需要在该项目中实现可拖动和可缩放的图形。
当前的实现涉及一个图形对象,该对象具有一组要绘制的预定义点。每当图形想要在屏幕上绘制一个点时,它都会要求“图形转换器”对该点应用仿射变换以获取其在屏幕上的位置。
图形转换器包含 X 和 Y 偏移以及缩放。所以基本上,一个点 P 将被转换如下:
P_x = zoom_x * P_x + offset_x
P_y = zoom_y * P_y + offset_y
当用户拖动图形时偏移量会更新,当用户滚动鼠标滚轮时会更新缩放量。
一切都按预期工作。问题是缩放总是相对于图形的原点(0,0)应用,这是正常的。但我想做的是应用相对于鼠标位置的缩放。
我一直在摸不着头脑,我对真实坐标和转换后的坐标有点困惑。
如何在不修改太多代码的情况下实现此功能?
这是我的 Java 方法:
转换点的方法:
public Point transform(Point p) {
Point transformed = new Point();
transformed.x = Math.round(Math.round((m_zoom.x * p.x) + m_offset.x));
transformed.y = Math.round(Math.round((m_zoom.y * p.y) + m_offset.y));
return transformed;
}
鼠标事件触发时调用的方法:
@Override
public void mousePressed(MouseEvent e) {
m_pressed = e.getPoint();
m_lastCalculatedOffset.x = 0;
m_lastCalculatedOffset.y = 0;
}
@Override
public void mouseDragged(MouseEvent e) {
Point zoomedDragging = new Point();
zoomedDragging.x = Math.round(Math.round(e.getX() - m_pressed.x));
zoomedDragging.y = Math.round(Math.round(e.getY() - m_pressed.y));
m_offset.x += zoomedDragging.x - m_lastCalculatedOffset.x;
m_offset.y += zoomedDragging.y - m_lastCalculatedOffset.y;
m_lastCalculatedOffset.x = zoomedDragging.x;
m_lastCalculatedOffset.y = zoomedDragging.y;
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
m_zoom.x *= Math.pow(ZOOM_FACTOR, e.getWheelRotation());
m_zoom.y *= Math.pow(ZOOM_FACTOR, e.getWheelRotation());
}
提前感谢您的帮助:)
【问题讨论】: