这是一种缩放点的技巧:

绘制地图

通过不使用变换来绘制地图来简化事物(不需要翻译,缩放!).

所需要的只是context.drawImage的缩放版本.

您所做的是将原始地图缩放到所需大小,然后从用户选择的缩放点向上和向左拉动它.

context.drawImage(

map,

0,0,map.width,map.height, // start with the map at original (unscaled) size

offsetX,offsetY, // pull the map leftward & upward from the scaling point

scaledWidth,scaledHeight // resize the map to the currently scaled size

选择缩放点(焦点):

缩放焦点实际上是2分!

第一个焦点是mouseX,mouseY,用户单击该按钮以设置所需的缩放点.重要的是要记住鼠标坐标位于缩放空间中.用户正在查看/单击的地图被缩放,因此他们的mouseX,mouseY也被缩放.

通过不缩放鼠标坐标来计算第二个焦点.第二个点是原始未缩放地图上的等效鼠标位置.

第二个未缩放的焦点用于计算从第一个焦点向左和向上拉刻度图的程度.

function setFocus(mx,my){

// mouseX,mouseY is the scaling point in scaled coordinates

focusX=mx;

focusY=my;

// convert the scaled focal point

// to an unscaled focal point

focusX1=parseInt((mx-mapLeft)/scale);

focusY1=parseInt((my-mapTop)/scale);

}

缩放地图

当用户表明他们想要将地图缩放或更大时:

>计算新的缩放地图宽度&高度

>计算从缩放点向上和向左拉动新缩放的地图需要多少偏移(缩放点先前由鼠标位置选择).

码:

function setScale(newScale){

scale=newScale;

// calc the width & height of the newly scaled map

mapWidth=parseInt(iw*scale);

mapHeight=parseInt(ih*scale);

// calc how much to offset the map on the canvas

mapLeft=parseInt(focusX-focusX1*scale);

mapTop =parseInt(focusY-focusY1*scale);

// draw the map

drawMap();

}

这是示例代码和演示:

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

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

var $canvas=$("#canvas");

var canvasOffset=$canvas.offset();

var offsetX=canvasOffset.left;

var offsetY=canvasOffset.top;

//

var counter=1;

var PI2=Math.PI*2;

var iw,ih;

var mapLeft,mapTop,mapWidth,mapHeight;

var focusX,focusY,focusX1,focusY1;

var scale;

var map=new Image();

map.οnlοad=start;

map.src="https://dl.dropboxusercontent.com/u/139992952/multple/mapSmall.png";

function start(){

iw=map.width;

ih=map.height;

// initial

mapLeft=0;

mapTop=0;

scale=1.00;

setFocus(iw/2*scale,ih/2*scale);

setScale(scale); // also sets mapWidth,mapHeight

drawMap();

//

$("#canvas").mousedown(function(e){handleMouseDown(e);});

//

canvas.addEventListener('DOMMouseScroll',handleScroll,false);

canvas.addEventListener('mousewheel',handleScroll,false);

}

//

function setScale(newScale){

scale=newScale;

mapWidth=parseInt(iw*scale);

mapHeight=parseInt(ih*scale);

mapLeft=parseInt(focusX-focusX1*scale);

mapTop =parseInt(focusY-focusY1*scale);

drawMap();

}

//

function setFocus(mx,my){

// mouseX,mouseY is the scaling point in scaled coordinates

focusX=mx;

focusY=my;

// convert the scaled focal point

// to an unscaled focal point

focusX1=parseInt((mx-mapLeft)/scale);

focusY1=parseInt((my-mapTop)/scale);

//

drawMap();

}

//

function drawMap(){

ctx.clearRect(0,0,canvas.width,canvas.height);

ctx.save();

ctx.drawImage(map,0,0,iw,ih,mapLeft,mapTop,mapWidth,mapHeight);

dot(ctx,focusX,focusY,"red");

ctx.restore();

}

function dot(ctx,x,y,fill){

ctx.beginPath();

ctx.arc(x,y,4,0,PI2);

ctx.closePath();

ctx.fillStyle=fill;

ctx.fill();

ctx.lineWidth=2;

ctx.stroke();

}

//

function handleScroll(e){

e.preventDefault();

e.stopPropagation();

var delta=e.wheelDelta?e.wheelDelta/30:e.detail?-e.detail:0;

if (delta){

counter+=delta;

setScale(1+counter/100);

}

};

//

function handleMouseDown(e){

e.preventDefault();

e.stopPropagation();

mouseX=parseInt(e.clientX-offsetX);

mouseY=parseInt(e.clientY-offsetY);

setFocus(mouseX,mouseY);

drawMap();

}

body{ background-color: ivory; }

canvas{border:1px solid red;}

Click to set zoom point
Use mousewheel to zoom

html画布 缩放的正方形,html5-canvas – 在动画HTML5画布中缩放和平移相关推荐

  1. html5 canvas实际应用,Html5 Canvas入门及经典应用

    Html5 Canvas入门及经典应用 时间:2019-02-15     来源:华清远见 canvas想必对于前端的工程师都不陌生了,它是 HTML5 新增的「画布」元素,是HTML5 的一大亮点, ...

  2. html5在线制作教程,HTML5 Canvas 制作动画

    HTML5 Canvas 制作动画 在HTML5 canvas中绘制图像动画效果,你需要绘制出每一帧的图像,然后在一个极短的时间内从一帧过渡到下一帧,形成动画效果. 在线示例 要在HTML5画布上绘制 ...

  3. html5 canvas绘制图形,html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  4. html5字体动画效果,7款超华丽的HTML5 Canvas文字动画特效

    原标题:7款超华丽的HTML5 Canvas文字动画特效 文字是网页中最为常见的元素之一,当然我们使用最多的就是调整文字的颜色.大小等基本属性.有时候我们在一些活动页面上需要展示特别样式的文字效果,这 ...

  5. html5绘制菱形,HTML5 canvas 菱形动画齿轮 - 开源中国

    原创. 通过 HTML5 canvas 创造由18个菱形构成的齿轮,并产生动画效果. An animation is made of the wheel consisting 18 diamends. ...

  6. html图像粒子转换动画,html5 canvas粒子动画生成图片特效

    特效描述:html5 canvas 粒子动画生成 图片特效.html5基于canvas粒子化图片 利用easying.js公式计算粒子动态轨迹方程, x轴方向和y轴方向的公式均可以选择 可以设置粒子运 ...

  7. html5 canvas 博客,html5 Canvas

    Canvas canvas就是一个画布,可以进行画任何的线,图形,填充等一系列操作,而且操作画图的就是js,所以让js编程到了嗑药的地步,另外,canvas不仅仅提供了简单的二维矢量绘图,也提供了三维 ...

  8. html5 canvas获取坐标系,HTML5 Canvas坐标变换

    我们在使用 Canvas 绘制图形时,可能会想对绘制的图形进行变换,例如让图形旋转90度,或者让图像缩小放大等,这些效果都可以通过 Canvas API 的坐标轴变换处理功能来实现. 图形旋转 如果我 ...

  9. html5 canvas 圆圈,使用HTML5 Canvas arc()绘制圆形/圆环

    前段时间的一个项目做到这个玩意,研究了一下绘制圆环的方法.最终使用HTML5的画布标签来做.arc()是HTML5 Canvas的一个API函数,作用是"创建弧/曲线(用于创建圆形或部分圆) ...

  10. html5 canvas 取消锯齿,HTML5 Canvas 如何取消反锯齿绘图

    一.问题的提出 我们都知道反锯齿(anti-aliasing)绘图给我们带来更好的视觉体验,有了这个技术,绘制的图形的边缘再不是以前毛毛躁躁的样子了.这就是采用反锯齿算法的功劳.其实质就是把要绘制的颜 ...

最新文章

  1. Struts2新特性
  2. 域上的全矩阵环是单环
  3. map可以用结构体作为健值吗?
  4. 9.4-6 kill killall pkill
  5. 杨元庆:乐Pad更适合中国消费者
  6. linux修改密码提示unix,linux中普通用户批改密码出现(passwd:Authentication token manipulation error)...
  7. JSP--(使用请求转发的动作标识jsp:forward)
  8. winform公共标签和常用属性
  9. python爬虫十二种方法_Python爬虫的N种姿势
  10. 什么样的公司卖什么货!
  11. Qt--将Qt 动态链接生成的exe及依赖dll打包方法
  12. 第02章 前馈神经网络
  13. 最新个人所得税计算方法
  14. Java中Arrays.sort()的三种常用用法(自定义排序规则)
  15. Ceph监控部署之inkscopeCalamari(v10.2.11)
  16. 通过Keras + LSTM训练天气污染程度预测模型
  17. 11大Java开源中文分词器的使用方法和分词效果对比(转)
  18. 设计一个靠谱的监控告警平台
  19. 报错:Fatal error: Uncaught Error: Call to undefined function mysql_connect()解决
  20. 简单好用的二级区域选择控件

热门文章

  1. Java connot reduce_Java8: Reduce方法
  2. 平台和计算机技术,两大平台技术提升及优势功能PK对比
  3. linux 超时 tcp,Linux中TCP设置syn超时时间
  4. linux只允许从ttyS0设备登录,linux自动以root登录,并自动启动用户程序的设置方...
  5. 20220129CTF刷题-- WEB方向
  6. c# 标准正太分布函数_机器学习中常见的几种概率分布
  7. dataframe两个表合并_DAXSQLPython实现报表项目存在串行的财务报表合并
  8. 4号团队-团队任务5:项目总结会
  9. BZOJ4318: OSU! (概率DP)
  10. 【bzoj1597】 土地购买