为了账号安全,请及时绑定邮箱和手机立即绑定

在鼠标滚轮滚动后计算图形中的偏移量和缩放

在鼠标滚轮滚动后计算图形中的偏移量和缩放

万千封印 2023-06-14 16:13:48
我目前正在用 Java 开发一个项目,我需要在其中实现一个可拖动和可缩放的图形。当前的实现涉及一个具有要绘制的预定义点数组的图形对象。每当图形想要在屏幕上绘制一个点时,它就会请求“图形转换器”对该点应用仿射变换以获得它在屏幕上的位置。图形转换器包含 X 和 Y 偏移以及缩放。所以基本上,点 P 将按如下方式转换:P_x = zoom_x * P_x + offset_xP_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;}触发鼠标事件时调用的方法:@Overridepublic void mousePressed(MouseEvent e) {    m_pressed = e.getPoint();    m_lastCalculatedOffset.x = 0;    m_lastCalculatedOffset.y = 0;}@Overridepublic 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;}@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {    m_zoom.x *= Math.pow(ZOOM_FACTOR, e.getWheelRotation());    m_zoom.y *= Math.pow(ZOOM_FACTOR, e.getWheelRotation());}在此先感谢您的帮助 :)
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

好的,所以在休息一下并在纸上用户图示例上绘制问题之后,我设法找到了解决方案:


如果我们在缩放发生时调用 ZoomP 鼠标的位置,一旦缩放完成,必须对偏移量进行以下转换:


newOffset_x = oldOffset_x + (1 - (newZoom_x / oldZoom_x)) * (ZoomP_x - oldOffset_x)

newOffset_y = oldOffset_y + (1 - (newZoom_y / oldZoom_y)) * (ZoomP_y - oldOffset_y)

所以这是我为那些感兴趣的人更新的 mouseWheelMoved 方法:


@Override

public void mouseWheelMoved(MouseWheelEvent e) {

    Point mousePos = e.getPoint();


    Point2D.Double newZoom = new Point2D.Double();

    newZoom.x = m_zoom.x * Math.pow(ZOOM_FACTOR, e.getWheelRotation());

    newZoom.y = m_zoom.y * Math.pow(ZOOM_FACTOR, e.getWheelRotation());


    m_offset.x += Math.round(Math.round((1 - (newZoom.x / m_zoom.x)) * (mousePos.x - m_offset.x)));

    m_offset.y += Math.round(Math.round((1 - (newZoom.y / m_zoom.y)) * (mousePos.y - m_offset.y)));


    m_zoom = newZoom;

}


查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信