使用Canvas实现封装路径,添加颜色,实现渐变,3d特效

news2024/11/17 19:39:44



 

目录

1.封装路径

2.添加颜色

3.渐变特效 

3.1线性渐变

3.2径向渐变 

3.3径向渐变模拟3d球


图形我们已经会绘制了,但是单一的图形肯定不好看,就像html没了css一样,所以今天我们要把图形上色。

1.封装路径

new Path2D()进行封装,将爱心封装成一个路径,然后在进行路径的绘制填充等一些操作,这样的优点就是可以使后面进行其他方法使用更加便捷。

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 封装一个爱心路径
        var hertPath = new Path2D();
        hertPath.moveTo(300, 200);
        hertPath.bezierCurveTo(350, 150, 400, 200, 300, 250);
        hertPath.bezierCurveTo(200, 200, 250, 150, 300, 200);
        ctx.fill(hertPath);
    </script>
</body>

 

 

2.添加颜色

万年不变的第一步,创建画布拿到画笔进行绘制,这里进行绘制的是一个爱心,这里首先是进行了一个封装操作,使用 new Path2D()进行封装,然后使用fillStyle进行颜色的填充,也可以使用这个属性strokeStyle进行轮廓颜色添加,这里的globalAlpha的作用就类似于opacity的作用,是全局所有的颜色进行一个透明度设置

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 设置全局透明度
        ctx.globalAlpha = 0.5;
        // 封装一个爱心路径
        var hertPath = new Path2D();
        hertPath.moveTo(300, 200);
        hertPath.bezierCurveTo(350, 150, 400, 200, 300, 250);
        hertPath.bezierCurveTo(200, 200, 250, 150, 300, 200);
        ctx.fillStyle = 'red';
        ctx.strokeStyle = 'black';
        ctx.fill(hertPath);
        ctx.stroke(hertPath);
    </script>
</body>

3.渐变特效 

3.1线性渐变

绘制一个正方形在100,200的地方正方形的宽高都为300,由于画布并没有那么大,所以呈现的是一个长方形使用createLinearGradient进行线性渐变颜色的创建,这单词本身也有线性渐变的意思,他里面的参数分别是,在这里的也就是从100,200坐标开始,知道400,500坐标,使用addColorStop颜色的渐变设置他里面有三个参数分别是stopcolor,stop从0.0到1.0,color就是所要进行线性渐变的颜色这里创建了一个函数,实现动态渐变的效果,因为stop是从0.0到1.0的所以在该范围内设置一个值并且每次符合条件就进行+=0.01,这样就能实现一个过度的效果,(甲:就这么一个函数就能实现吗?)我的回答是:no,他需要配和requestAnimationFrame进行使用,这是一个专门服务于canvas的一个动画函数,使用他就可以进行动态效果的展示了,下面的效果自己看吧。

x0渐变开始点的 x 坐标
y0渐变开始点的 y 坐标
x1渐变结束点的 x 坐标
y1渐变结束点的 y 坐标
<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        // 找到画布
        var c1 = document.querySelector('#c1');
        // 获取画笔,上下文对象
        var ctx = c1.getContext('2d');
        // 绘制图形(x,y,width,height)
        // 颜色渐变
        var index = 0;
        function render() {
            ctx.clearRect(0, 0, 600, 400);
            index += 0.01;
            if (index > 1) {
                index = 0;
            }
            let linearGradient = ctx.createLinearGradient(100, 200, 400, 500);
            linearGradient.addColorStop(0, 'red');
            linearGradient.addColorStop(index, 'plum');
            linearGradient.addColorStop(1, 'blue');
            ctx.fillStyle = linearGradient;
            ctx.fillRect(100, 200, 300, 300);
            requestAnimationFrame(render);
        }
        requestAnimationFrame(render);
    </script>
</body>

渐变效果

3.2径向渐变 

啥是径向渐变呢?顾名思义,径向渐变,实际上就是椭圆渐变,圆只是一种特殊的椭圆。 径向渐变从圆心点以椭圆形状向外扩散,渐变的实现由两部分组成:椭圆和颜色。 椭圆部分用来控制径向渐变的位置、大小和形状等。createRadialGradient用法和createLinearGradient差不多,参数如下,开始和结束的坐标都为300,200,半径是从0变化到100的,这样就能是实现下图的效果啦

x0渐变的开始圆的 x 坐标
y0渐变的开始圆的 y 坐标
r0开始圆的半径
x1渐变的结束圆的 x 坐标
y1渐变的结束圆的 y 坐标
r1结束圆的半径
<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        // 找到画布
        var c1 = document.querySelector('#c1');
        // 获取画笔,上下文对象
        var ctx = c1.getContext('2d');
        // 绘制图形(x,y,width,height)
        // 径向颜色渐变
        let radiaGradient = ctx.createRadialGradient(300, 200, 0, 300, 200, 100);
        radiaGradient.addColorStop(0, 'red');
        radiaGradient.addColorStop(0.3, 'plum');
        radiaGradient.addColorStop(1, 'blue');
        ctx.fillStyle = radiaGradient;
        ctx.fillRect(0, 0, 600, 400);
    </script>
</body>

3.3径向渐变模拟3d球

首先要创建画布,再拿到画笔,在使用arc进行圆形的绘制,在使用径向渐变从250,150的坐标开始绘制半径从15绘制到100直到绘制到300,200的坐标结束绘制,这里的颜色尤为重要,3d球主要是靠颜色的差值来模拟3d形状的圆球的

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        // 找到画布
        var c1 = document.querySelector('#c1');
        // 获取画笔,上下文对象
        var ctx = c1.getContext('2d');
        // 绘制图形(x,y,width,height)
        let radiaGradient = ctx.createRadialGradient( 250, 150, 15,300, 200, 100);
        radiaGradient.addColorStop(0, 'pink');
        radiaGradient.addColorStop(1, 'red');
        ctx.fillStyle = radiaGradient;
        ctx.arc(300, 200, 100, 0, Math.PI * 2);
        ctx.fill();

    </script>
</body>

3d球效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NAPI简介

NAPI简介 它的核心概念就是不采用中断的方式读取数据&#xff0c;而代之以首先采用中断唤醒数据接收的服务程序&#xff0c;然后 POLL 的方法来轮询数据。NAPI是综合中断方式与轮询方式的技术。 中断的好处是响应及时&#xff0c;如果数据量较小&#xff0c;则不会占用太多的…

百度发布Apollo 8.0,架构、能力双双升级

12月28日&#xff0c;百度举行了Apollo开放平台8.0线上发布会。会上&#xff0c;百度正式推出Apollo开放平台8.0&#xff0c;进一步夯实了平台的易用性&#xff0c;让开发者操作更简单易上手。同时&#xff0c;百度Apollo也面向外界分享了在自动驾驶教育、生态合作伙伴等方面的…

SuperMap GIS基础软件中数据库使用指南

作者&#xff1a;Carlo 一、支持的主流数据库类型 1、主流数据库介绍 数据库名称版本不支持的数据集类型需要配置 客户端支持工作空间支持集群模式SQLPlus2008/2012/2016/2018&#xff08;仅 Windows 平台支持&#xff09;视频、复合点、复合线、复合面、复合文本数据集是是是…

球王贝利去世终年 82 岁,其是世界上唯一三次夺取世界杯冠军的足球运动员,如何评价他的传奇一生?

当地时间12月29日&#xff0c;巴西圣保罗市阿尔伯特爱因斯坦医院发布公告称&#xff0c;巴西知名运动员、“球王”贝利因结肠癌引发多器官衰竭&#xff0c;于当天15时27分去世&#xff0c;终年82岁。贝利女儿凯丽纳西门托在社交媒体发文&#xff1a;“我们的一切都归功于你&…

VR餐厅全新思路,可以为餐饮行业带来哪些好处?

餐饮行业的寒冬即将过去&#xff0c;逐渐迎来了发展的好机会&#xff0c;趁此机遇你会怎么做呢&#xff1f;餐饮行业的竞争依旧激烈&#xff0c;也许你的餐厅占据了很好的地理位置&#xff0c;或者是拥有时尚有品位的装修风格&#xff0c;亦或者拥有美味可口的菜品&#xff0c;…

报表开发工具FastReport.NET的五大常见问题及解决方法

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载&#xff08;qun&#x…

黑马Hive+Spark离线数仓工业项目--数仓主题应用层ST层构建(1)

数仓主题应用层ST层构建 1. 构建ST层&#xff1a;数据应用层 掌握每个主题的聚合指标和聚合的维度 - 工单主题 - 油站主题 - 回访主题 - 安装主题 - 费用主题2. DM层的设计 - 运营部门需要的数据抽取 数仓分层回顾 目标&#xff1a;回顾一站制造项目分层设…

使用命令设置Windows音量和音频输出设备

前言 Windows似乎并没有音量设置的命令&#xff0c;也没有输出设备的设置命令。如果你知道&#xff0c;请告诉我一下~ 因此&#xff0c;这里使用了一个神级小工具&#xff1a;nircmd 官网下载地址&#xff1a; 32位&#xff1a;http://www.nirsoft.net/utils/nircmd.zip 64…

2023年网络安全工程师面试题合集【首发】

以下为信息安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作~ 【一一帮助安全学习【点我】一一】①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④50 份安全攻防面试指南⑤安全红队渗透工具包⑥网络安…

Mathorcup数学建模竞赛第五届-【妈妈杯】D题:图像去噪中几类稀疏变换的矩阵表示(附一等奖获奖论文和matlab代码实现)

赛题描述 假设一幅二维灰度图像 X 受到加性噪声的干扰:Y=X+N ,Y 为观察到的噪声图像, N 为噪声。通过对于图像 Y 进行稀疏表示可以达到去除噪声的目的。任务: 2. 利用 Cameraman 图像中的一个小图像块(见图 1)进行验证。 3. 分析稀疏系数矩阵,比较四种方法的硬阈值稀…

类和对象(中)

原文再续&#xff0c;书接上回&#xff01;&#xff01; 继续类和对象的学习。 目录 构造函数 析构函数 拷贝构造 赋值重载 运算符重载 const成员 取地址及const取地址操作符重载 当我们没有向类中写入任何成员的时候&#xff08;也就是空类&#xff09;&#xff0c;类中…

【每日一题Day72】LC855考场就座 | 构造数据结构 动态数组+二分查找

考场就座【LC855】 There is an exam room with n seats in a single row labeled from 0 to n - 1. When a student enters the room, they must sit in the seat that maximizes the distance to the closest person. If there are multiple such seats, they sit in the sea…

宝藏又小众的东方行走rpg制作大师素材网站分享

看到大家都在问东方行走rpg制作大师素材&#xff0c;既要免费又要质量好&#xff0c;数量还要多&#xff0c;小编好不容易挖到了宝藏素材网站哦&#xff0c;资源优质数量庞大&#xff0c;使用体验也很好&#xff0c;要是需要的话&#xff0c;赶紧看一看&#xff0c;小编会给大家…

深潜价值互联网蓝海,2022中国区块链产业发展报告发布|陀螺研究院年终献礼...

2022年&#xff0c;是全球发展史上重要的一年&#xff0c;在俄乌冲突以及全球通胀的大背景下&#xff0c;全球经济环境风高浪急、风云诡谲&#xff0c;数字经济正以前所未有的速度冲击着世界固有格局&#xff0c;并成为撬动全球经济复苏和快速增长的新杠杆。围绕数字经济的科技…

软考在哪可以报名?

软考每年有两次考试&#xff0c;分别安排在上半年和下半年&#xff0c;上半年考试时间为5月下旬&#xff0c;下半年考试时间为11月上旬&#xff0c;每年考试时间并不是固定的。 2023年软考考试时间 根据往年软考时间安排来看&#xff0c;预计2023年软考考试时间上半年在5月中…

vue - - - - - 你不知道的技巧

vue - 你不知道的技巧1. 路由参数获取1. 路由参数获取 关于路由参数的获取&#xff0c;相信如下操作很常见: <script> export default {data() {return {};},mounted() {console.log("路由参数", this.$route.params.id);} }; </script>还有一种不太常…

C Primer Plus 第六版(中文版)第十五章(完美修订版)编程练习答案

//本博主所写的代码仅为阅读者提供参考&#xff1b; //若有不足之处请提出&#xff0c;博主会尽其所能修改&#xff1b; //附上课后编程练习题目&#xff1b; //若是对您有用的话请点赞或分享提供给它人&#xff1b; //---------------------------------------------------…

操作系统——进程与线程

进程与线程一、进程的概念1、进程和进程实体2、进程的组织方式3、进程的特征二、进程的状态与转换1、进程的状态2、进程的转换三、进程控制1、定义2、原语控制①创建原语②撤销原语③阻塞原语④唤醒原语⑤切换原语四、进程通信方法一&#xff1a;共享内存方法二&#xff1a;管道…

惠州学院采购JKTD-1000型铁电材料测试仪

惠州学院采购JKTD-1000型铁电材料测试仪 JKTD-1000型铁电材料测试仪 模式测量电路&#xff0c;与传统的 Sawyer-Tawer-模式相比&#xff0c;此电路取消了外接电容&#xff0c;可减小寄生元件的影响。此电路的测试精度取决于积分器积分电容的精度&#xff0c;减少了对测试的影响…

软件测试概念篇

目录 1.软件测试 2.需求 2.1 用户需求 2.2 软件需求 2.3 测试人员眼里的需求 2.4 需求的重要性 3.测试用例 3.1 什么是测试用例 3.2 为什么有测试用例 4.BUG 4.1 BUG的概念 4.2 如何描述一个BUG 4.3 如何定义BUG的优先级 4.4 BUG的生命周期 5.软件生命周期 6. …