千呼万唤 HTML 5 (10) - 画布(canvas)之转换

从零开始:Vivado中自定义串口通信IP核的完整实现 本文详细介绍了在Vivado中从零开始实现自定义串口通信IP核的完整流程,包括Verilog核心代码编写、仿真验证、IP核封装与参数化配置技巧。通过AXI-Lite总线实现动态配置,提升FPGA开发效率,适用于各种嵌入式系统通信需求。 阅读详情

原文地址:http://www.cnblogs.com/webabcd/archive/2012/02/22/2362505.html

作者:webabcd



介绍
HTML 5: 画布(canvas)之转换(转换画布的用户坐标系)

  • 平移 | translate()
  • 旋转 | rotate()
  • 缩放 | scale()
  • 矩阵转换 | transform(a, b, c, d, e, f)
  • 矩阵转换 | setTransform(a, b, c, d, e, f)



示例
1、平移 | translate()
canvas/transform/translate.html

<!DOCTYPE HTML>
<html>
<head>
    <title>平移</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="background-color: rgb(222, 222, 222)">
        您的浏览器不支持 canvas 标签
    </canvas>
    <br />
    <button type="button" onclick="drawIt();">不断地点我看 Demo</button>
    <button type="button" onclick="clearIt();">清除画布</button>

    <script type="text/javascript">

        var ctx = document.getElementById('canvas').getContext('2d');

        var canvasX = 0;
        var canvasY = 0;

        var stepX = 20;
        var stepY = 20;

        function drawIt() {
            if (canvasX == 0 && canvasY == 0)
                ctx.strokeRect(0, 0, 100, 100);

            canvasX += stepX;
            canvasY += stepY;

            /*
             * context.translate(x, y) - 将当前的用户坐标系平移指定的距离
             *   x - x 轴方向上需要平移的像素数
             *   y - y 轴方向上需要平移的像素数
             */
            ctx.strokeStyle = "blue";
            ctx.translate(stepX, stepY);
            ctx.strokeRect(0, 0, 100, 100);
        }

        function clearIt() {
            ctx.translate(-canvasX, -canvasY);
            canvasX = 0;
            canvasY = 0;
            ctx.strokeStyle = "black";

            ctx.clearRect(0, 0, 400, 400);
        }

    </script>
</body>
</html>


2、旋转 | rotate()
canvas/transform/rotate.html

<!DOCTYPE HTML>
<html>
<head>
    <title>旋转</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="background-color: rgb(222, 222, 222)">
        您的浏览器不支持 canvas 标签
    </canvas>
    <br />
    <button type="button" onclick="drawIt();">不断地点我看 Demo</button>
    <button type="button" onclick="clearIt();">清除画布</button>

    <script type="text/javascript">

        var ctx = document.getElementById('canvas').getContext('2d');

        var canvasRadian = 0;
        var stepRadian = 15 * Math.PI / 180;

        function drawIt() {
            if (canvasRadian == 0)
                ctx.strokeRect(360, 0, 20, 60);

            canvasRadian += stepRadian;

            /*
             * context.rotate(radian) - 将当前的用户坐标系旋转指定的弧度,顺时针为正值,逆时针为负值
             *   radian - 弧度值
             */
            ctx.strokeStyle = "blue";
            ctx.rotate(stepRadian);
            ctx.strokeRect(360, 0, 20, 60);
        }

        function clearIt() {
            ctx.rotate(-canvasRadian);
            canvasRadian = 0;
            ctx.strokeStyle = "black";

            ctx.clearRect(0, 0, 400, 400);
        }

    </script>
</body>
</html>


3、缩放 | scale()
canvas/transform/scale.html

<!DOCTYPE HTML>
<html>
<head>
    <title>缩放</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="background-color: rgb(222, 222, 222)">
        您的浏览器不支持 canvas 标签
    </canvas>
    <br />
    <button type="button" onclick="drawIt();">不断地点我看 Demo</button>
    <button type="button" onclick="clearIt();">清除画布</button>

    <script type="text/javascript">

        var ctx = document.getElementById('canvas').getContext('2d');

        var canvasScaleX = 1;
        var canvasScaleY = 1;

        var stepScaleX = 1.1;
        var stepScaleY = 1.1;

        function drawIt() {
            if (canvasScaleX == 1 && canvasScaleY == 1)
                ctx.strokeRect(0, 0, 60, 60);

            canvasScaleX *= stepScaleX;
            canvasScaleY *= stepScaleY;

            /*
             * context.scale(x, y) - 将当前的用户坐标系缩放指定的倍数
             *   x - 水平方向上的缩放倍数
             *   y - 垂直方向上的缩放倍数
             */
            ctx.strokeStyle = "blue";
            ctx.scale(stepScaleX, stepScaleY);
            ctx.strokeRect(0, 0, 60, 60);
        }

        function clearIt() {
            ctx.scale(1 / canvasScaleX, 1 / canvasScaleY);
            canvasScaleX = 1;
            canvasScaleY = 1;
            ctx.strokeStyle = "black";

            ctx.clearRect(0, 0, 400, 400);
        }

    </script>
</body>
</html>


4、矩阵转换 | transform(a, b, c, d, e, f)
canvas/transform/transform.html

<!DOCTYPE HTML>
<html>
<head>
    <title>矩阵转换 | transform(a, b, c, d, e, f)</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="background-color: rgb(222, 222, 222)">
        您的浏览器不支持 canvas 标签
    </canvas>
    <br />
    <button type="button" onclick="drawIt();">不断地点我看 Demo</button>
    <button type="button" onclick="clearIt();">清除画布</button>

    <script type="text/javascript">

        var ctx = document.getElementById('canvas').getContext('2d');

        var canvasScaleX = 1;
        var canvasScaleY = 1;

        var stepScaleX = 1.1;
        var stepScaleY = 1.1;

        function drawIt() {
            if (canvasScaleX == 1 && canvasScaleY == 1)
                ctx.strokeRect(0, 0, 60, 60);

            canvasScaleX *= stepScaleX;
            canvasScaleY *= stepScaleY;

            /*
             * context.transform(a, b, c, d, e, f) - 按指定的矩阵转换当前的用户坐标系
             *   相当于:context.transform(M11, M12, M21, M22, OffsetX, OffsetY)
             *
             * 关于仿射矩阵参考:http://www.cnblogs.com/webabcd/archive/2008/11/03/1325150.html
             *
             *   |X|             |M11(默认值 1)      M21(默认值 0)       0|
             *   |Y| = |x y 1| * |M12(默认值 0)      M22(默认值 1)       0|
             *   |1|             |OffsetX(默认值 0)  OffsetY(默认值 0)   1|
             *
             *   X = x * M11 + y * M12 + OffsetX
             *   Y = x * M21 + y * M22 + OffsetY
             */
            ctx.strokeStyle = "blue";
            ctx.transform(stepScaleX, 0, 0, stepScaleY, 0, 0);
            ctx.strokeRect(0, 0, 60, 60);
        }

        function clearIt() {
            ctx.transform(1 / canvasScaleX, 0, 0, 1 / canvasScaleY, 0, 0);
            canvasScaleX = 1;
            canvasScaleY = 1;
            ctx.strokeStyle = "black";

            ctx.clearRect(0, 0, 400, 400);
        }

    </script>
</body>
</html>


5、矩阵转换 | setTransform(a, b, c, d, e, f)
canvas/transform/setTransform.html

<!DOCTYPE HTML>
<html>
<head>
    <title>矩阵转换 | setTransform(a, b, c, d, e, f)</title>
</head>
<body>
    <canvas id="canvas" width="400" height="400" style="background-color: rgb(222, 222, 222)">
        您的浏览器不支持 canvas 标签
    </canvas>
    <br />
    <button type="button" onclick="drawIt();">Demo</button>
    <button type="button" onclick="clearIt();">清除画布</button>

    <script type="text/javascript">

        var ctx = document.getElementById('canvas').getContext('2d');

        function drawIt() {
            ctx.strokeStyle = "red";
            ctx.scale(2, 2);
            ctx.strokeRect(0, 0, 60, 60);

            /*
             * context.setTransform(a, b, c, d, e, f) - 首先重置用户坐标系,然后再按指定的矩阵转换用户坐标系(translate, rotate, scale, transform 是针对当前用户坐标系做转换,而 setTransform 是针对重置后的用户坐标系做转换)
             *   相当于:context.setTransform(M11, M12, M21, M22, OffsetX, OffsetY)
             *
             * 关于仿射矩阵参考:http://www.cnblogs.com/webabcd/archive/2008/11/03/1325150.html
             *
             *   |X|             |M11(默认值 1)      M21(默认值 0)       0|
             *   |Y| = |x y 1| * |M12(默认值 0)      M22(默认值 1)       0|
             *   |1|             |OffsetX(默认值 0)  OffsetY(默认值 0)   1|
             *
             *   X = x * M11 + y * M12 + OffsetX
             *   Y = x * M21 + y * M22 + OffsetY
             */
            ctx.strokeStyle = "blue";
            ctx.setTransform(1, 0, 0, 1, 0, 0);
            ctx.strokeRect(0, 0, 60, 60);
        }

        function clearIt() {
            ctx.clearRect(0, 0, 400, 400);
        }

    </script>
</body>
</html>



OK
[源码下载]


langchain1.X学习笔记-38-RAG之文档加载器()pdf、word、markdown、html、文件夹 加载pdf(PyPDFLoader),加载Markdown(UnstructuredMarkdownLoader),加载HTML(UnstructuredHTMLLoader),加载File Directory(DirectoryLoader) 阅读详情

相关推荐

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

canvas内容移动与交互

canvas里的内容绘制上去之后,无法直接进行控制。 创建一个用来维护canvas中内容的对象 canvas每次绘制都是从可维护的内容对象中取值,进行绘制的。 class Circle { constructor(id, x, y, r) { this.id = id this.x = x this.y = y this.r = r ..

球球不吃虾WHR2349博客 1511

pltjs:一种编程语言设计原型工具

plt.js 一种编程语言设计原型工具 概述 plt.js 是一个用于编写和测试编程语言语法的环境。 您以 HTMLish 语法编写语言的语法和示例代码,plt.js 将根据您的语法解析您的代码并显示结果。 它还将为您提供一个接口到您的语言中,因此您可以立即感受它。 它看起来像这样: < grammar> start = '(' '+' space a:number ' ' b:number space ')' { return a + b } number = d:digit+ { return parseInt( d.join('') ) } digit = [0123456789] space = ' '* </ grammar> < h3> Addition </ h3> < code> (+ 5 10

canvas画布转换

平移 移动画布的原点 translate(x,y) 参数表示移动目标点的坐标 //位移 ctx.beginPath() ctx.translate(100, 100);//位移的是画布的基点 缩放 scale(x,y) 参数表示宽高的缩放比例 //缩放 ctx.scale(2, 2); ctx.strokeRect(-50, -50, 50, ...

qq_44899153的博客 301

画布和图片互相转换,使用画布canvas通过ajax、表单等方式将图片上传到服务器,拿来就用,拿来测试

画布和图片互相转换,使用画布canvas通过ajax、表单等方式将图片上传到服务器,拿来就用,拿来测试

mengzhanfei1的博客 652

HTML5 2D Canvas手机游戏开发经验谈

临渊羡鱼,不如退而结网—HTML5 2DCanvas手机游戏开发经验谈 现在什么技术最火?HTML5!现在什么技术最时尚!还是HTML5!也许有泡沫和炒作的成分,但是不得不承认,这个世界上本就没有所谓的公平。多年来兢兢业业带给我们无数快乐痛苦和就业机会的Flash,在代表着众多巨头利益,从蹒跚学步起就被内定为太子的HTML5面前,也许注定就是为他人做嫁衣的命。 当你在网上看到铺

探路者 2447

html内容canvas内容的实现方法 将html为图片的方法 html2canvas.js的使用

介绍 因为要做记录将html的内容canvas并且作为图片显示。 其实是因为要做一个H5页面,类似于小测试,最后的测试结果是以图片输出的(其实canvas也能直接长按保存)。在网上找到了一个js库可以把html的元素canvas,特此记录以免自己忘记了 htmlcanvas的库: html2canvas.js官网 意思就是 html to canvas (html can...

角角兔的博客 2万+

千呼万唤 HTML 5 (11) - 画布canvas)之效果

介绍HTML 5画布canvas)之效果 填充色, 笔划色, 颜色值 | fillStyle, strokeStyle 剪裁 | clip() 渐变色 | createLinearGradient(), createRadialGradient(), CanvasGradient.addColorStop() 贴图的平铺模式 | createPattern() 阴影效果 ...

yangshen998 250

在MID使用Gnome Canvas实现连续的仿射变换的问题

续上文: http://blog.csdn.net/shallon_luo/archive/2009/09/16/4557785.aspx (1)占用的CPU/内存资源太多。经过测试,比起用GTK+GDK绘图的简单实现来说要耗费更多的CPU和内存资源。 (2)屏幕上的图像上的每个点经过连续的仿射变换来完成连续的图像效果,由于仿射变换是浮点运算,坐标(x,y)经过连续的浮点运

shallon 的笔记 870

HTML课程笔记补4

3.计对移动端的配置<meta name="viewport" content="width=device-width, initial-scale=1.0">注意:不能在<head><html><meta><script><style><title>等元素里使用。注意:不能在<head><html><meta><script><style><title>等元素里使用。注意:不可以在<head><html><meta><script><style><title>等元素中使用。

2601_96748017的博客 207

HTML 的 <meter> 元素

meter>是 HTML5 新增的语义化标签,用于展示已知范围内的标量测量值,例如磁盘使用量、CPU 占用率、投票结果、评分等。它以一个可视化的进度条/仪表形式呈现,让用户能直观地感知当前数值在整体范围中的位置。需要特别注意的是,<meter>只适合表示「已知最大值和最小值」的度量值。如果只是展示一个不确定的进度(比如文件上传进度),应该使用 <progress>元素,两者不要混淆。不同浏览器对 <meter>的默认外观略有差异。

IMPYLH的博客 285

Day 15 | 不改一行 HTML,给页面加上引号、角标和标签

本文是《30天精通CSS》专栏第 15 篇,订阅专栏不迷路。同一个效果,两种写法差在哪:一个真加了标签,一个只是画了个装饰content:伪元素的发动机进阶:attr() 让装饰读 HTML 里的值分界线:伪类单冒号,伪元素双冒号最容易翻车的地方:content 漏写,装饰凭空消失。

m0_53751797的博客 173

HTML 的 <p> 元素

p>元素虽然简单,却是构建网页文本内容的基础。掌握它的语法、嵌套规则和 CSS 配合技巧,能让你写出结构清晰、样式美观的页面。希望本文对你有所帮助,快去动手实践吧!

IMPYLH的博客 166

【AI动画】HTML 动画帧 vs GIF:生成方案、优劣对比,结合 AI 如何选择动画方案

标签:# 动画方案 #GIF #HTML 动画 #前端动画 #AI 视频生成 #Remotion #ComfyUI 前言

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 351

Python进阶教程:24_Markdown HTML 零基础超详细教程

本文介绍了使用Python-Markdown库将Markdown文本转换HTML的完整指南。主要内容包括:环境安装配置、基础文本和文件转换、常用扩展功能(表格、目录、代码高亮等)的使用方法。特别提供了完整的实战模板,包含内嵌CSS样式,可直接生成美观的HTML文档。同时总结了中文乱码、表格不显示等常见问题的解决方案,推荐新手优先使用Python-Markdown库,并配合extra扩展满足日常需求。

zhanghaha1314的博客 439

HTML 的 <ol> 元素

元素<ol>是 HTML 中用于创建有序列表(Ordered List)的标签。与无序列表 <ul>不同,<ol>中的每一项会自动带有编号,例如数字、字母或罗马数字,用于表示项目的先后顺序或优先级。一个最基本的有序列表示例:< ol > < li > 第一步:准备食材 </ li > < li > 第二步:加热锅具 </ li > < li > 第三步:翻炒食材 </ li > </ ol >

IMPYLH的博客 224

HTML课程笔记补3

input type="checkbox" name="hobby" value="smoke">抽烟。<input type="checkbox" name="hobby" value="drink">喝酒。<input type="checkbox" name="hobby" value="perm">烫头。<input type="radio" name="sex" value="female">女。<input type="radio" name="sex" value="male">男。

2601_96748017的博客 168

HTML系列教程:10_HTML 样式 — CSS 零基础详解

本文介绍了CSS的基础知识及其三种引入方式:行内样式(通过style属性直接写在HTML标签内)、内部样式表(在head中使用style标签定义)和外部样式表(通过link引入独立CSS文件)。文章详细讲解了CSS语法结构、常用属性和三大基础选择器(标签、类和ID选择器),并比较了不同引入方式的优先级。外部样式表因其复用性和结构分离特性成为项目开发首选。最后提供了综合示例和常见错误提示,帮助初学者掌握CSS基础应用。

zhanghaha1314的博客 390

HTML第七章 表格标签

主要用于布局,早期布局使用表格处理。(表头,样式会加粗)

2401_89563276的博客 219

批量获取并导出照片GPS经纬度坐标信息

批量获取并导出照片GPS经纬度坐标1、本软件为博自行开发,经过测试发布,可以读取单张照片GPS经纬度坐标数据,可在软件中查看,通常是WGS84地理坐标系。2、也可以批量获取图片GPS经纬度坐标,并批量导出,坐标一般为WGS84坐标。3、具体的实用方法非常简单,批量导出后的GPS经纬度坐标信息内容中包含图片名称等信息,可以方便工作和日常使用。

上一篇: 千呼万唤 HTML 5 (9) - 画布(canvas)之承载媒体
下一篇: 千呼万唤 HTML 5 (11) - 画布(canvas)之效果
scoliver
博客等级 码龄15年 54粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值