html5实现坐标旋转的方法,HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)

2023-11-06

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

平移(translate)

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

图示如下:

6d2e2a40976afac759cb2177aa0b9c4e.gif 

任何原来的坐标点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 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大小。效果如图示:

6154eefa5f51528e97acfdb8ee6ca2cc.gif 

复制代码代码如下:

// 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)

77ca86265765520fa4723e530a41eda6.gif 

旋转前的坐标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 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);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html5实现坐标旋转的方法,HTML5 Canvas实现平移/放缩/旋转deom示例(附截图) 的相关文章

  • LInux 锂电池驱动分析

    锂电池的驱动程序要实现以 下五个功能 1 可以自动检测到当前给电 池充电的是USB还 是AC 2 组织过大的充电电流 3 坏电池检测 4 死亡温度的检测 5 电池电压的测量 当我们要写一个锂 电池的驱动程序 的时候 首先 要知道内核提 供给
  • SpringBoot+Shiro实现免密登录

    1 自定义登录认证规则 import org apache shiro authc UsernamePasswordToken public class EasyUsernameToken extends UsernamePasswordT
  • DM6446的视频前端VPFE驱动之ioctl控制(视频缓存区,CCDC,decoder)解析之一

    本文均属自己阅读源码的点滴总结 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email 200803090209 zjut com gzzaigcn2012 gmail com 在这里分析驱动的ioctl的内容时 需要结
  • Feature Pyramid Networks for Object Detection 论文笔记

    论文地址 Feature Pyramid Networks for Object Detection 前言 这篇论文主要使用特征金字塔网络来融合多层特征 改进了CNN特征提取 论文在Fast Faster R CNN上进行了实验 在COCO
  • 本地jar包上传的maven仓库,引用jar包中的pom依赖无法下载

    新项目开发公共组件 上传到公司maven仓库 记一次本地项目打包 上传到公司maven仓库的坑 mvn deploy deploy file DgroupId com test 分组 DartifactId test jar名称 Dvers
  • 【cuda】——cuda,opencv混合编程

    思路来自 https www cnblogs com dwdxdy p 3528711 html 但是其cuda源码是有问题的 没有cmakelists txt 背景 采用cuda gpu交换opencv图像的 r b通道 0 代码 mai
  • 恒生ufx接口转变成CTP接口

    由于当初自己的程序是对接ctp接口 里面大量使用了ctp的东西 但最近又要对接恒生的系统 想着不改整个程序 把ufx接口封装成ctp的接口形式 这样上层的业务逻辑都不用改了 已实现的主要功能 ReqUserLogin ReqOrderIns
  • C++的mutable

    一 介绍 mutable的中文意思是 可变的 易变的 正好与const相反 在C 中 mutable也是为了突破const的限制而设置的 被mutable修饰的变量 将永远处于可变的状态 即使在一个const函数中 二 用法 如果类的成员函
  • Nginx 动态负载均衡

    Nginx 负载均衡 动态实现 1 概览 1 传统配置实现的负载均衡 在加减服务器的时候 会遇到下面的问题 1 配置文件是默认地址 则需要重载配置文件 nginx s reload 加载配置文件流程 1 主进程通知worker进程进行重启
  • 一文了解什么是字节对齐(超详细)

    目录 1 什么是字节对齐 2 空类 3 带虚函数的类 32位机器 64位机器 1 什么是字节对齐 得分点 什么是内存对齐 内存对齐的原因 内存对齐的规则 标准回答 什么是内存对齐 现代计算机中内存空间都是按照 字节 byte 划分的 从理论
  • mnist数据集转换成图片和csv文档

    通常官网提供的mnist数据集都是压缩格式的文档 有时候我们在使用的时候需要将其 1 解压成图片格式存入文件夹 2 或者保存成csv格式的文档 1 保存成图片格式 windows下 coding utf 8 Created on Tue F
  • linux audit审计服务audit.rules策略参数

    audit是linux内核的特性 可以通过内核参数audit 1来启用 etc audit audit rules是audit的规则文件 本文主要讲述如何利用audit来监视系统重要资源 一 监控文件系统行为 依靠文件 目录的权限属性来识别
  • 统计回文

    回文串 是一个正读和反读都一样的字符串 比如 level 或者 noon 等等就是回文串 花花非常喜欢这种拥有对称美的回文串 生日的时候她得到两个礼物分别是字符串A和字符串B 现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一
  • udev使用笔记

    一 什么是udev udev是linux kernel的设备管理器 在最新的内核版本中kernel 3 10中udev已经代替了以前devfs hotplug等功能 意味着它要处理添加 删除硬件时 所有的用户空间行为 实际上为什么我关注这个
  • 华为OD机试 - 称砝码(Java)

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 输入描述 对于每组测试数据 第一行 n 砝码的种数 范
  • Anduino+esp8266_relay继电器 开发智能开关,APP可远程控制

    一 准备工作 1 在网上要购买一块ESP8266 01s带relay继电器的 价格10几元 2 网上购买一个USB转TTL的转接头 我自己用是CH340 价格几元 3 找一个服务器 当然免费的最好 我用的是酱菜创客平台 此平台是给创客提供一
  • 降温的区块链,或许是一个全新开始!

    现如今 区块链的降温正在让跟风与吹捧现出原形 人们开始从庞杂的区块链市场当中找到新的发展方向 区块链开始从简单的打概念 搞论坛 发ICO 逐步转移到了具体应用上 从这个角度来看 当下降温的区块链或许正孕育着一个全新的开始 区块链开始找到数字
  • STAR法则,被这个理由拒绝这么多次,必须搞明白!

    首先 STAR法则是一种常常被HR使用的工具 用来收集与面试者工作相关的具体信息和能力 一个概念 STAR法则 即为Situation Task Action Result的缩写 具体含义是 Situation情境 HR希望你描述一个你遇到
  • chromecast投屏_如何将手机或者ipad投屏到电脑上

    最玩游戏近老想把ipad投屏到电脑上 于是小编了解了一下现在好用的投屏APP 发现了傲软投屏 这是一款能够同时兼容iOS和安卓系统的同屏软件 支持在Windows及Mac上使用 只要您的安卓系统在5 0及以上 支持Chromecast协议

随机推荐

  • 蓝桥杯 算法训练:最小距离(Java)

    题目 数轴上有n个数字 求最近的两个数 即min abs x y 格式 第一行包含一个整数n 接下来一行 表示n整数 样例输入 6 7 3 4 11 9 17 样例输出 1 思路 刚开始打算使用普通的两两数组元素进行比较 但是发现到达第9个
  • 前端H5使用canvas画爱心以及笑脸

    目录 canvas简介 画爱心 效果 画笑脸 效果 结语 canvas简介 canvas是HTML5中推出的新功能 可以在页面上生成一个画布 使用js可以在画布上绘制一些图形 画爱心 画爱心我们需要用到bezierCurveTo方法 可以绘
  • 算法 - 折半查找(C#)

    递归实现 csharp view plain copy print
  • 什么是服务器信息怎么看,怎么查看服务器信息

    怎么查看服务器信息 内容精选 换一换 在您申请了云耀云服务器后 可以通过管理控制台查看和管理您的云耀云服务器 本节介绍如何查看云耀云服务器的详细配置 包括云耀云服务器名称 镜像信息 系统盘 数据盘 安全组 弹性公网IP等信息 登录管理控制台
  • 网盘服务器安装监控系统,服务器监控程序一键安装

    服务器监控程序一键安装 内容精选 换一换 依照配置并导入样例工程中导入和修改样例后 即可在开发环境中 右击 JDBCExample java 选择 Run JDBCExample main 运行对应的应用程序工程 使用Windows访问MR
  • 互联网公司常见性能测试(压测)面试题

    一 性能测试流程 1 首先制定性能测试计划 确定各项指标的目标 期望 2 申请压力机 3 制定性能测试方案 4 执行脚本 如用jmeter命令执行jmx文件 监控数据 zabbix CAT 5 分析数据 并出性能测试报告 二 性能测试关键指
  • Pycharm和Anaconda的关系

    Pycharm和Anaconda的关系 学习记录 知识点输出有风险 相信需谨慎 1 python 所存在的问题两个 第一个 自身缺少numpy matplotlib scipy scikit learn 等一系列包 需要安装pip来导入这些
  • STM32F103RC通过DHT11获取温湿度

    文章目录 bsp dht1 c bsp dht1 h 例子下载 bsp dht1 c file bsp TimBase c author stylle version V1 0 date 2021 xx xx brief DTH11温湿度获
  • Android Studio的NDK的配置

    有时会遇到NDK的配置错误 NDK配置如下 最好不要选择最新版本 我看网上攻略大多是使用21 0 6113669这个版本
  • git 撤回 (git版本回退处理)

    项目中 我们会遇到 提交的项目代码有问题 需要执行撤回命令 但是发现撤回之后还是会运行失败 下边是一个好方法 亲测比 git reset hard 版本号 有效 下面我们详细解说一下 一 已提交 没有push 回滚 当我们本地已经 执行了g
  • 【记关于github应用认证重定向到localhost的疑问】

    要做一个关于github 的OAuth第三方登录 在配置重定向url的时候填写的是本地的测试端口localhos 8080 然后登录认证后可以重定向到本地接口 关于这个重定向我就不理解为啥它可以知道我的IP地址 然后搜索发现这个重定向是告诉
  • JAVA jdk1.8安装图文解说

    对于 jdk 的安装 网上有很多种图文解说 但是老鸟发现它们大都不严谨 非常不适合小白 本节课 老鸟就给大家做个小白教程 无论你多么菜 你一定可以安装上 否则你加我微信 我给你打五毛钱 立帖为证 jdk 有很多版本 我们应该安装哪个呢 如果
  • Python单链表

    用Python写了一个单链表 具有和Python的列表list相似的一些函数 Single link list class Node def init self item self elem item self next None clas
  • php的socket通信以及出现的错误,php的Socket通信以及出现的错误

    php的Socket通信以及出现的错误 flag 1 do conn socket socket accept sock msg Send Message Hello World if socket write conn socket ms
  • grep正则表达式后面的单引号和双引号的区别?

    单引号 可以说是所见即所得 即将单引号内的内容原样输出 或者描述为单引号里面看到的是什么就会输出什么 单引号 是全引用 被单引号括起的内容不管是常量还是变量者不会发生替换 双引号 把双引号内的内容输出出来 如果内容中有命令 变量等 会先把变
  • 【华为机试在线训练】Day 6

    题目描述 定义一个二维数组N M 其中2 lt N lt 10 2 lt M lt 10 如5 5数组下所示 int maze 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表
  • 建议收藏:不能不刷的100道数字IC笔/面试题!

    一 IC设计流程及相应EDA开发工具 前端设计 逻辑设计 1 规格制定 根据客户需求 具体的功能和性能要求 制定芯片规格Spec 2 详细设计 设计方案 具体实现架构 模块划分 3 HDL编码 将实际的硬件电路功能通过HDL语言描述出来 形
  • WebRTC带宽估计

    整体架构 上面这张图是一个比较老的架构图 但是也基本能说明整体架构 早期webrtc版本带宽估计是放到接收端处理 目前最新版本带宽估计放到了发送端 但是接收端计算得到的带宽并没有废弃 而是通过rtcp remb反馈给发送端 在发送端带宽估计
  • 锁相环技术,单边带信号,信号的调制

    什么是锁相环技术 用在接收机中 因为在相干解调的时候 需要接收机产生一个和发射机同频同相的载波频率 这时候就要对发射机处的载波频率进行精确的追踪 锁相环技术就是这样精准跟踪载波频率的一种技术 锁相环 PLL 是一种数字信号处理技术 用于将输
  • html5实现坐标旋转的方法,HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)

    HTML5 Canvas中提供了实现图形平移 旋转 放缩的API 平移 translate 平移坐标translate x y 意思是把 0 0 坐标平移到 x y 原来的 0 0 坐标则变成 x y 图示如下 任何原来的坐标点p ox o