当前位置: 首页 > 面试题库 >

放大一个点(使用缩放和平移)

全卜霸
2023-03-14
问题内容

我希望能够放大HTML 5画布中鼠标下方的点,例如Google Maps上的。我该如何实现?


问题答案:

终于解决了:

var zoomIntensity = 0.2;



var canvas = document.getElementById("canvas");

var context = canvas.getContext("2d");

var width = 600;

var height = 200;



var scale = 1;

var originx = 0;

var originy = 0;

var visibleWidth = width;

var visibleHeight = height;





function draw(){

    // Clear screen to white.

    context.fillStyle = "white";

    context.fillRect(originx,originy,800/scale,600/scale);

    // Draw the black square.

    context.fillStyle = "black";

    context.fillRect(50,50,100,100);

}

// Draw loop at 60FPS.

setInterval(draw, 1000/60);



canvas.onwheel = function (event){

    event.preventDefault();

    // Get mouse offset.

    var mousex = event.clientX - canvas.offsetLeft;

    var mousey = event.clientY - canvas.offsetTop;

    // Normalize wheel to +1 or -1.

    var wheel = event.deltaY < 0 ? 1 : -1;



    // Compute zoom factor.

    var zoom = Math.exp(wheel*zoomIntensity);



    // Translate so the visible origin is at the context's origin.

    context.translate(originx, originy);



    // Compute the new visible origin. Originally the mouse is at a

    // distance mouse/scale from the corner, we want the point under

    // the mouse to remain in the same place after the zoom, but this

    // is at mouse/new_scale away from the corner. Therefore we need to

    // shift the origin (coordinates of the corner) to account for this.

    originx -= mousex/(scale*zoom) - mousex/scale;

    originy -= mousey/(scale*zoom) - mousey/scale;



    // Scale it (centered around the origin due to the trasnslate above).

    context.scale(zoom, zoom);

    // Offset the visible origin to it's proper position.

    context.translate(-originx, -originy);



    // Update scale and others.

    scale *= zoom;

    visibleWidth = width / scale;

    visibleHeight = height / scale;

}


<canvas id="canvas" width="600" height="200"></canvas>

关键是计算轴位置,以便缩放点(鼠标指针)在缩放后保持在同一位置。

最初,鼠标mouse/scale与角之间有一段距离,我们希望鼠标下方的点在缩放后保持在同一位置,但这是mouse/new_scale远离角的地方。因此,我们需要移动origin(角的坐标)以解决此问题。

originx -= mousex/(scale*zoom) - mousex/scale;
originy -= mousey/(scale*zoom) - mousey/scale;
scale *= zoom

然后,其余代码需要应用缩放并转换到绘制上下文,以便其原点与画布角重合。



 类似资料:
  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 我在Java中编码了一个Mandelbrot集分形,并包含了平移和放大分形的能力。唯一的问题是,当我平移图像并试图放大时,它看起来好像试图放大中心并平移一点。平移和缩放不是真正的平移或缩放,而是对分形的重新计算,看起来像是平移或缩放。 这是我的代码。 我能告诉用户在哪里可以让相机更精确地缩放吗? 先谢谢你。 编辑:图片对于任何想知道这个程序将呈现什么。

  • 当前位置 private void chart1\u鼠标单击(object sender,MouseEventArgs e){ 缩放X和Y @taW

  • 我是一名Ruby/PHP web应用程序开发人员已经有一段时间了,我已经习惯了水平缩放服务器实例以处理更多请求的想法。水平缩放-意味着位于负载均衡器后面的应用程序的独立实例,它们什么都不共享,彼此不知道。 由于websocket有效地保持了浏览器和服务器之间的开放式通信线路,那么PHP/Ruby世界中典型的水平缩放架构是否会导致像链接中所解释的那样的聊天应用程序中断--因为新的websocket连

  • 我正在做自己的画布抽屉项目,只是停留在放大/缩小功能上。在我的项目中,我使用缩放和平移来进行缩放,因为我想将所有画布及其元素保持在中心。在画了一点草图(不是数学天才)之后,我成功地画出了下面的公式用于翻译过程,因此缩放后画布将保持在它的视口的中间:旧的宽度和高度/ 2 -新的宽度和高度(这是旧的宽度和高度乘以比例步长,在我的例子中是1.1)/2。从逻辑上讲,这应该行得通。但是在尝试了几次放大和缩小

  • 我试图创建一个具有可缩放/可折叠画布的应用程序。 特点: 用鼠标滚轮在支点处放大/缩小 用鼠标左键在画布上拖动节点 用鼠标右键拖动整个画布 很明显是枢轴点计算出了问题,但我想不出是什么,怎么修复。 非常感谢!