如何居中缩放JointJS论文

Mar*_*ria 4 jointjs

我已经实现了纸张缩放,效果很好。

我将其链接到鼠标滚轮的滚动,但是仍然遇到一个问题:在API中,scale函数定义为,scale paper.scale(sx, sy, [ox, oy])并且我认为ox和oy可以将缩放居中到特定位置。就我而言,该位置应该是指针。但是,尽管我交出了坐标(offsetX以及offsetY鼠标事件的坐标),但这绝对没有任何效果。

有人可以给我一个如何使用ox和的示例oy吗?

Rom*_*man 5

不要忘记先将鼠标坐标转换为视口坐标系。

function offsetToLocalPoint(offsetX, offsetY, paper) {
    var svgPoint = paper.svg.createSVGPoint();
    svgPoint.x = offsetX;
    svgPoint.y = offsetY;
    var offsetTransformed = svgPoint.matrixTransform(paper.viewport.getCTM().inverse());
    return offsetTransformed
}
Run Code Online (Sandbox Code Playgroud)

translatepaper.scale()使用scale指定的转换原点[ox,oy]进行调用之前,请重置先前的视口转换。您可以在下面的mousewheel事件处理程序示例中看到这一点。

function onMouseWheel(e) {

    e.preventDefault();
    e = e.originalEvent;

    var delta = Math.max(-1, Math.min(1, e.wheelDelta)) / SPEED;
    var newScale = V(paper.viewport).scale().sx + delta;

    if (newScale > MIN_SCALE && newScale < MAX_SCALE) {
        paper.setOrigin(0, 0); // reset the previous 'translate'            
        var p = offsetToLocalPoint(e.offsetX, e.offsetY);
        paper.scale(newScale, newScale, p.x, p.y);
    }
}
Run Code Online (Sandbox Code Playgroud)

跨浏览器版本在这里摆弄。