HTML5 Canvas平移,放缩,旋转演示

简介: HTML5 Canvas平移,放缩,旋转演示

HTML5 Canvas中提供了实现图形平移,旋转,放缩的API。

平移(translate)

平移坐标translate(x, y)意思是把(0,0)坐标平移到(x, y),原来的(0,0)坐标则变成(-x, -y)

图示如下:


任何原来的坐标点p(ox, oy)在translate之后的坐标点为p(ox-x, oy-y),其中点(x, y)为平移


点坐标translate(x, y)。


代码演示:


// translate is move the startpoint to centera and back to top left corner


function renderText(width, height, context) {


   context.translate(width/ 2, height / 2); // 中心点坐标为(0, 0)


   context.font="18px Arial";


   context.fillStyle="blue";


   context.fillText("Please Press <Esc> to Exit Game",5,50);


   context.translate(-width/2, -height/2); // 平移恢复(0,0)坐标为左上角


   context.fillText("I'm Back to Top",5,50);


}

放缩(Scale)

Scale(a, b)意思是将对象沿着XY轴分别放缩至a*x,  b*y大小。效果如图示:


// translation the rectangle.


function drawPath(context) {


   context.translate(200,200);


   context.scale(2,2);// Scale twice size of original shape


   context.strokeStyle= "green";


   context.beginPath();


   context.moveTo(0,40);


   context.lineTo(80,40);


   context.lineTo(40,80);


   context.closePath();


   context.stroke();


}

旋转(rotate)

旋转角度rotate(Math.PI/8)

旋转前的坐标p(x, y)在对应的旋转后的坐标P(rx, ry)为

Rx = x * cos(-angle) - y * sin(-angle);


Ry = y * cos(-angle) + x * sin(-angle);


旋转90度可以简化为:


Rx = y;


Ry = -x;


Canvas中旋转默认的方向为顺时针方向。演示代码如下:


// new point.x = x * cos(-angle) -y * sin(-angle),


// new point.y = y * cos(-angle) +x * sin(-angle)


function renderRotateText(context) {


   context.font="24px Arial";


   context.fillStyle="red";


   context.fillText("i'm here!!!",5,50);


 


   // rotate -90 degreee


   // context.rotate(-Math.PI/2);


   // context.fillStyle="blue";


   // context.fillText("i'm here!!!", -400,30);


 


   // rotate 90 degreee


   context.rotate(Math.PI/2);


   context.fillStyle="blue";


   context.fillText("i'm here!!!",350,-420);


 


   console.log(Math.sin(Math.PI/2));


 


   // rotae 90 degree and draw 10 lines


   context.fillStyle="green";


   for(var i=0; i<4; i++) {


       var x = (i+1)*20;


       var y = (i+1)*60;


       var newX = y;


       var newY = -x;


       context.fillRect(newX,newY, 200, 6);


   }


}


通常做法是旋转与平移一起使用,先将坐标(0,0)平移到中心位置


translate (width/2, height/2)然后再使用rotate(Math.PI/2)完成旋转


代码示例如下:


function saveAndRestoreContext(context) {


   context.save();


   context.translate(200,200);


   context.rotate(Math.PI/2);


   context.fillStyle="black";


   context.fillText("2D Context Rotate And Translate", 10, 10);


   context.restore();


   context.fillText("2D Context Rotate And Translate", 10, 10);


}

全部JavaScript代码:

    var tempContext = null; // global variable 2d context
    window.onload = function() {
      var canvas = document.getElementById("target");
      canvas.width = 450;
      canvas.height = 450;
      
      if (!canvas.getContext) {
          console.log("Canvas not supported. Please install a HTML5 compatible browser.");
          return;
      }
      
      // get 2D context of canvas and draw image
      tempContext = canvas.getContext("2d");
      // renderText(canvas.width, canvas.height, tempContext);
      saveAndRestoreContext(tempContext);
      // drawPath(tempContext);
    }
    
    // translate is move the start point to centera and back to top left corner
    function renderText(width, height, context) {
      context.translate(width / 2, height / 2);
      context.font="18px Arial";
      context.fillStyle="blue";
      context.fillText("Please Press <Esc> to Exit Game",5,50);
      context.translate(-width / 2, -height / 2);
      context.fillText("I'm Back to Top",5,50);
    }
    
    // translation the rectangle.
    function drawPath(context) {
      context.translate(200, 200);
      context.scale(2,2); // Scale twice size of original shape
      context.strokeStyle = "green";
      context.beginPath();
      context.moveTo(0, 40);
      context.lineTo(80, 40);
      context.lineTo(40, 80);
      context.closePath();
      context.stroke();
    }
    
    // new point.x = x * cos(-angle) - y * sin(-angle), 
    // new point.y = y * cos(-angle) + x * sin(-angle)
    function renderRotateText(context) {
      context.font="24px Arial";
      context.fillStyle="red";
      context.fillText("i'm here!!!",5,50);
      
      // rotate -90 degreee
      // context.rotate(-Math.PI/2);
      // context.fillStyle="blue";
      // context.fillText("i'm here!!!", -400,30);
      
      // rotate 90 degreee
      context.rotate(Math.PI/2);
      context.fillStyle="blue";
      context.fillText("i'm here!!!", 350,-420);
      
      console.log(Math.sin(Math.PI/2));
      
      // rotae 90 degree and draw 10 lines
      context.fillStyle="green";
      for(var i=0; i<4; i++) {
        var x = (i+1)*20;
        var y = (i+1)*60;
        var newX = y;
        var newY = -x;  
        context.fillRect(newX, newY, 200, 6);
      }
    }
    
    function saveAndRestoreContext(context) {
      context.save();
      context.translate(200,200);
      context.rotate(Math.PI/2);
      context.fillStyle="black";
      context.fillText("2D Context Rotate And Translate", 10, 10);
      context.restore();
      context.fillText("2D Context Rotate And Translate", 10, 10);
    }
相关文章
|
18天前
|
Web App开发 移动开发 前端开发
html5 canvas五彩碎纸屑飘落动画特效
h5 canvas飘落纸片动画是一款实现五彩纸屑飘落的背景动画特效,基于canvas绘制的空中飘落的纸屑片动画特效,适用于网页动态背景效果代码。简单使用,欢迎下载!代码适用浏览器:搜狗、360、FireFox(建议)、Chrome、Safari、Opera、傲游、世界之窗,是一款不错的的特效插件,希望大家喜欢!
34 5
|
29天前
|
前端开发
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
24 0
基于canvas实现的彩色纸屑组成文字3d动画HTML源码
|
29天前
|
移动开发 前端开发 HTML5
HTML5 Canvas制作的粒子十秒倒计时源码
一段基于HTML5 Canvas制作的粒子爆炸,十秒数字倒计时,全屏倒计时动画效果,给人一种非常大气的视觉感
33 0
HTML5 Canvas制作的粒子十秒倒计时源码
|
1月前
|
前端开发 JavaScript
Canvas三维变化背景动画HTML源码
Canvas三维变化背景动画HTML源码
34 5
|
3月前
|
XML 移动开发 前端开发
HTML5 SVG和canvas的性能探讨
HTML5 中的 SVG(可缩放矢量图形)和 Canvas(画布)分别用于网页图形绘制。SVG 基于矢量图形,使用 XML 描述,适合静态或少量动态内容(如图标、图表),易于编辑且保持高分辨率;Canvas 则基于位图,通过 JavaScript 绘制,更适合快速更新大量图形的场景(如游戏、动态动画),但在复杂图形计算时可能遇到性能瓶颈。总体而言,SVG 适用于静态和少量动态内容,而 Canvas 更适合高频率更新和性能要求高的场景。
|
3月前
|
移动开发 前端开发 JavaScript
HTML5 Canvas详解及应用
HTML5 Canvas 允许通过 JavaScript 在网页上动态绘制图形、动画等视觉内容。首先在 HTML 中定义 `&lt;canvas&gt;` 元素,并通过 JavaScript 获取画布上下文进行绘制。常见方法包括绘制矩形、路径、圆形和文本,以及处理图像和创建动画效果。适用于游戏开发、数据可视化、图像编辑和动态图形展示等多种应用场景。需要注意性能优化、无状态绘制及自行处理事件等问题。
|
3月前
|
移动开发 前端开发 数据挖掘
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图
用HTML5中的 画布(Canvas)在“圳品”信息系统网页上绘制显示饼图
|
28天前
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
56 7
|
28天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
35 6