第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

在鼠標(biāo)滾輪滾動(dòng)后計(jì)算圖形中的偏移量和縮放

在鼠標(biāo)滾輪滾動(dòng)后計(jì)算圖形中的偏移量和縮放

萬千封印 2023-06-14 16:13:48
我目前正在用 Java 開發(fā)一個(gè)項(xiàng)目,我需要在其中實(shí)現(xiàn)一個(gè)可拖動(dòng)和可縮放的圖形。當(dāng)前的實(shí)現(xiàn)涉及一個(gè)具有要繪制的預(yù)定義點(diǎn)數(shù)組的圖形對象。每當(dāng)圖形想要在屏幕上繪制一個(gè)點(diǎn)時(shí),它就會請求“圖形轉(zhuǎn)換器”對該點(diǎn)應(yīng)用仿射變換以獲得它在屏幕上的位置。圖形轉(zhuǎn)換器包含 X 和 Y 偏移以及縮放。所以基本上,點(diǎn) P 將按如下方式轉(zhuǎn)換:P_x = zoom_x * P_x + offset_xP_y = zoom_y * P_y + offset_y偏移量在用戶拖動(dòng)圖形時(shí)更新,縮放比例在用戶滾動(dòng)鼠標(biāo)滾輪時(shí)更新。一切都按預(yù)期工作。問題是縮放總是相對于圖形的原點(diǎn) (0,0) 應(yīng)用的,這是正常的。但我想做的是應(yīng)用相對于鼠標(biāo)位置的縮放。我撓頭已經(jīng)有一段時(shí)間了,我對真實(shí)坐標(biāo)和轉(zhuǎn)換后的坐標(biāo)有點(diǎn)困惑。如何在不修改太多代碼的情況下實(shí)現(xiàn)此功能?這是我的 Java 方法:變換要點(diǎn)的方法: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;}觸發(fā)鼠標(biāo)事件時(shí)調(diào)用的方法:@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貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

好的,所以在休息一下并在紙上用戶圖示例上繪制問題之后,我設(shè)法找到了解決方案:


如果我們在縮放發(fā)生時(shí)調(diào)用 ZoomP 鼠標(biāo)的位置,一旦縮放完成,必須對偏移量進(jìn)行以下轉(zhuǎn)換:


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;

}


查看完整回答
反對 回復(fù) 2023-06-14
  • 1 回答
  • 0 關(guān)注
  • 234 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號