【Canvas与艺术】模拟八一电影制片厂电影片头效果

news2024/10/1 11:31:11

【缘起】

八一厂每部电影前都有其专有开头,如:https://www.ixigua.com/6799821997258834440?logTag=2eacce76401e13f9efe7

这个片头可以用canvas模拟下来。

【关键点】

线型放射状粒子系统的运作。

立体感五角星的绘制。

【图例】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>模拟八一电影制片厂片头</title>
     <style type="text/css">
     .centerlize{
        margin:0 auto;
        width:1200px;
     }
     </style>
     </head>

     <body οnlοad="init();">
        <div class="centerlize">
            <canvas id="myCanvas" width="10px" height="10px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 边长
const WIDTH=1000;
const HEIGHT=540;

// 舞台对象
var stage;

//-------------------------------
// 初始化
//-------------------------------
function init(){
    // 获得canvas对象
    var canvas=document.getElementById('myCanvas');  
    canvas.width =WIDTH;
    canvas.height=HEIGHT;

    // 初始化canvas的绘图环境
    ctx=canvas.getContext('2d');  
    ctx.translate(WIDTH/2,HEIGHT/2);// 原点平移到画布中央

    // 准备
    stage=new Stage();    
    stage.init();

    // 开幕
    animate();
}

// 播放动画
function animate(){    
    stage.update();    
    stage.paintBg(ctx);
    stage.paintFg(ctx);     

    // 循环
    if(true){
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){
    // 粒子数量
    this.starCnt=500;

    // 粒子数组
    this.points=[];

    // 初始化
    this.init=function(){
        // 放射性原始数组
        var arr=[];
        for(let i=0;i<360;i++){
            let theta=i*Math.PI*2/360;
            var pt={};
            pt.x=54*Math.cos(theta);
            pt.y=54*Math.sin(theta);
            pt.theta=theta;
            arr.push(pt);
        }


        for(let i=0;i<this.starCnt;i++){
            // 随机取原始数组的一个
            let idx=Math.floor(Math.random()*arr.length);
            let pt=arr[idx];

            // 创建点
            var point={};
            point.x=arr[idx].x;
            point.y=arr[idx].y;
            point.step=Math.random()*10+1;
            point.theta=arr[idx].theta;
            point.xInitial=arr[idx].x;
            point.yInitial=arr[idx].y;

            // 放入粒子数组
            this.points.push(point);
        }
    }

    // 更新
    this.update=function(){
        const DIS=WIDTH/2*WIDTH/2+HEIGHT/2*HEIGHT/2;

        for(i=0;i<this.starCnt;i++){
            var pt=this.points[i];

            pt.x+=pt.step*Math.cos(pt.theta);
            pt.y+=pt.step*Math.sin(pt.theta);

            var distance=pt.x*pt.x+pt.y*pt.y;
            
            // 越过对角线长度一半即回到初始位置
            if(distance>DIS)
            {    pt.x=pt.xInitial;
                pt.y=pt.yInitial;
            }
        }
    }

    // 画背景
    this.paintBg=function(ctx){
        // 清屏
        ctx.clearRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);    

        ctx.fillStyle = "rgba(0, 64, 128, 0.8)";// 加上半透明蒙层,字和光源便出现了残影效果
        ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);        
    }

    // 画前景
    this.paintFg=function(ctx){    
        
        // 用直线模拟放射状光芒
        for(let i=0;i<this.starCnt;i++){
            var pt=this.points[i];
            
            ctx.beginPath();
            ctx.moveTo(pt.x,pt.y);
            ctx.lineTo(pt.x-20*Math.cos(pt.theta),pt.y-20*Math.sin(pt.theta));
            ctx.closePath();
            ctx.lineWidth=2;
            ctx.strokeStyle="white";
            ctx.stroke();
        }

        // 渐变色圈(可不加)
        var rgnt=ctx.createRadialGradient(0,0,30,0,0,80);         
        rgnt.addColorStop(0,"rgb(255,255,255)");
        rgnt.addColorStop(1,"rgba(0,64,128,0.001)");
        ctx.fillStyle=rgnt;
        ctx.beginPath();
        ctx.arc(0,0,80,0,2*Math.PI,true);
        ctx.closePath();
        ctx.fill();

        // 画白底五角星
        draw5Star(ctx,0,0,90,"white");

        // 画立体五角星
        const R=80;// 五角星外角半径
        const r=30;// 五角星内角半径
        ctx.save();
        ctx.rotate(Math.PI/10);
        for(let i=0;i<5;i++){
            var alpha=i*2*Math.PI/5-Math.PI/5;
            var beta=i*2*Math.PI/5;            

            // 画红色一半
            var x1=R*Math.cos(alpha);
            var y1=R*Math.sin(alpha);
            var x2=r*Math.cos(beta);
            var y2=r*Math.sin(beta);
            ctx.beginPath();
            ctx.moveTo(0,0);
            ctx.lineTo(x1,y1);
            ctx.lineTo(x2,y2);
            ctx.closePath();
            ctx.fillStyle="red";
            ctx.fill();

            // 画黄色一半
            var gama=(i)*2*Math.PI/5+Math.PI/5;
            var x3=R*Math.cos(gama);
            var y3=R*Math.sin(gama);

            ctx.beginPath();
            ctx.moveTo(0,0);            
            ctx.lineTo(x3,y3);
            ctx.lineTo(x2,y2);
            ctx.closePath();
            ctx.fillStyle="yellow";
            ctx.fill();
        }
        ctx.restore();

        // 下方文字说明
        ctx.save();
        ctx.shadowColor = 'black';
        ctx.shadowOffsetX = 5;
        ctx.shadowOffsetY = -2;
        ctx.shadowBlur = 5;
        ctx.textAlign="center";
        ctx.textBaseLine="Middle";
        ctx.font="40px Microsoft YaHei UI";
        ctx.fillStyle="white";    
        ctx.fillText('模拟八一电影制片厂电影片头',0,200);


        ctx.font="10px Microsoft YaHei UI";
        ctx.fillStyle="white";    
        ctx.fillText('逆火原创',450,260);

        ctx.restore();
    }
}

// 画实心五角星的函数
function draw5Star(ctx,x,y,r,color){
    ctx.save()
    ctx.translate(x-r,y-r);    
    ctx.beginPath();
    ctx.moveTo(r, 0);
    ctx.lineTo(r+Math.cos(Math.PI*3/10)*r, r+Math.sin(Math.PI*3/10)*r);
    ctx.lineTo(r-Math.cos(Math.PI*1/10)*r, r-Math.sin(Math.PI*1/10)*r);
    ctx.lineTo(r+Math.cos(Math.PI*1/10)*r, r-Math.sin(Math.PI*1/10)*r);
    ctx.lineTo(r-Math.cos(Math.PI*3/10)*r, r+Math.sin(Math.PI*3/10)*r);
    ctx.lineTo(r, 0);
    ctx.closePath();
    ctx.fillStyle=color;
    ctx.fill();
    ctx.restore();
}

/*--------------------------------------------------------------------------
浪急方舟静 山险马背平
--------------------------------------------------------------------------*/
//-->
</script>

END

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

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

相关文章

如何模拟在丢包情况下的传输测试(以镭速为例)

在现代社会&#xff0c;网络通信的可靠性和效率是数据传输的关键因素。网络通信中的丢包问题&#xff0c;作为一种普遍存在的现象&#xff0c;可能对数据传输的完整性和效率产生重大影响。本文的目的是探讨在存在丢包的网络环境中&#xff0c;如何通过模拟测试来评估和改进一款…

【Linux】详解进程终止进程等待

一、页表&&写时拷贝的进一步理解 页表中不仅仅只有虚拟地址到物理地址的映射&#xff0c;还包括了很多选项&#xff0c;其中就包括了映射条目的权限。当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时&#xff0c;如果数据的内容不允许被修改&#xff…

vue 预览excel文件的又一伟大实践 —— vue-office

实际上&#xff0c;预览excel这个功能&#xff0c;我之前已经写过一个文章了。如下&#xff0c;使用的是 luckysheet/luckyExcel 实现的。 vue 实现在线预览Excel-LuckyExcel/LuckySheet实现方案_excel在线预览的方案-CSDN博客 但是最近客户使用发现一个bug&#xff0c;就是某…

vulnhub Kioptrix Level 1通关

目录 环境安装 信息收集 0X01靶机IP搜寻 1.1ifconfig查看本机IP域 1.2.nmap搜寻IP 2.直接arp-scan指令查看IP 0X02端口扫描 0X03漏洞利用 反弹shell 另一种通关方法推荐 环境安装 靶机下载&#xff1a;https://download.vulnhub.com/kioptrix/Kioptrix_Level_1.rar …

10个你必须知道的浏览器指纹检测工具,保护你的隐私安全

在当前的数字时代&#xff0c;个人隐私保护变得越来越重要&#xff0c;特别是对于互联网用户来说。有一种叫做“浏览器指纹”的技术&#xff0c;它能悄悄收集我们使用的浏览器和设备的各种细节信息。这本是为提供个性化服务&#xff0c;但对那些需要在不同平台同时管理多个账号…

应对Locked勒索病毒威胁:你的数据安全准备好了吗?

导言&#xff1a; .Locked勒索病毒&#xff0c;作为一种新型的恶意软件&#xff0c;已经在全球范围内引起了广泛的关注。这种病毒通过加密受害者的文件&#xff0c;并要求支付赎金以获取解密密钥&#xff0c;从而实现对受害者的勒索。本文旨在深入解析.Locked勒索病毒的特点、…

AXI Memory Mapped to PCI Express学习笔记(一)——PCIe事务

1 PCIe事务 AXI事务对于PCIe来说&#xff0c;主要涉及到在AXI总线和PCIe总线之间进行数据交换和通信的过程。在PCIe系统中&#xff0c;AXI总线作为一个连接不同组件的桥梁&#xff0c;可以实现高效的数据传输和事务处理。 AXI事务通常包括读事务和写事务。在读事务中&#xf…

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…

Div4 898 G,H

Here G. ABBC or BACB 解题思路 一个可以向左或向右吃掉一段连续的将连续的合成一个则字符串变为每个之间被隔开统计变化后和的数量为若&#xff0c;则若&#xff0c;则只会大1&#xff0c;即有一段没被吃掉&#xff0c;则让长度最小的剩下&#xff0c;省略号间的的个数不影响…

Partisia Blockchain:真正做到兼顾隐私、高性能和可拓展的公链

目前&#xff0c;包括 Secret Network、Oasis Protocol 等在内的绝大多数以隐私为特性的可编程公链&#xff0c;在兼顾隐私的同时&#xff0c;在可拓展以及性能上或多或少的有所牺牲&#xff0c;即难以对诸多实际应用场景进行支撑。这归咎于链的设计以及共识机制的不合理&#…

C++ explicit隐式类型转换

单参数构造函数支持隐式类型的转换 什么意思&#xff1f; 简单来理解就是&#xff1a; 一个类对象的构造函数的参数只有一个&#xff0c;就可以直接进行赋值传参 例如构造函数的参数为int&#xff0c;且只有一个int 就可以直接将int类型的整型数据转换成类对象 也就是说从int类…

JavaScript、ES6与微信小程序:工具箱、升级与新房子

JavaScript、ES6和微信小程序三者之间有什么联系&#xff1f;我想&#xff0c;作为初学者还是有点蒙。下面作一个简单的分析&#xff0c;供大家参考。 首先,我们可以把JavaScript想象成一个非常强大的工具箱,里面装满了各种各样的工具。这些工具可以帮助我们完成各种任务,比如…

SpringBoot集成 itextpdf 根据模板动态生成PDF

目录 需求说明前期准备Spring Boot 集成添加依赖构建工具类构建MultipartFile编辑PDF模板Java代码设置对应form的key-value 需求说明 根据合同模板&#xff0c;将动态的合同标签&#xff0c;合同方以及合同签约时间等动态的生成PDF&#xff0c;供用户下载打印。 前期准备 安…

C语言看完我这篇编译与链接就够啦!!!

1. 前言 Hello&#xff01;大家好我是小陈&#xff0c;今天来给大家介绍最详细的C语言编译与链接。 2. 编译和链接 我们通常用的编译器&#xff0c;比如Visual Sudio,这样的IDE(集成开发环境&#xff09;一般将编译和链接的过程一步完成&#xff0c;通常将这这种编译和链接合…

腾讯云4核8G服务器性能测评_CPU内存性能_带宽流量_系统盘

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

MySQL数据库 - 单表查询(三)

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.03.24 Last edited: 2024.03.24 目录 第1关&#xff1a;对查询结果进行排序 任务描述 相关知识 对查询结果排序 指定排序方向 编程要…

设计模式之建造者模式精讲

也叫生成器模式。将一个复杂的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 在建造者模式中&#xff0c;有如下4个角色&#xff1a; 抽象建造者&#xff08;Builder&#xff09;&#xff1a;用于规范产品的各个组成部分&#xff0c;并进行抽象&…

U盘未格式化,数据恢复攻略大揭秘

U盘遭遇未格式化困境&#xff0c;数据安全岌岌可危 在日常的工作和生活中&#xff0c;U盘以其便携、容量大的特性成为了我们不可或缺的存储工具。然而&#xff0c;有时我们会遇到这样一个棘手的问题&#xff1a;当我们将U盘插入电脑时&#xff0c;却收到了“未格式化”的提示。…

Vue3新手教程

Vue3新手教程 一. Vue3简介1. 性能的提升2.源码的升级3. 拥抱TypeScript4. 新的特性 二. 创建Vue3工程1. 基于 vue-cli 创建2. 基于 vite 创建(推荐)3. 一个简单的效果 三. Vue3核心语法1. OptionsAPI 与 CompositionAPI2. 拉开序幕的 setup2.1 setup 概述2.2 setup 的返回值2.…

【LVGL-键盘部件,实体按键控制】

LVGL-二维码库 ■ LVGL-键盘部件■ 示例一&#xff1a;键盘弹窗提示■ 示例二&#xff1a;设置键盘模式■ 综合示例&#xff1a; ■ LVGL-实体按键控制■ 简介 ■ LVGL-键盘部件 ■ 示例一&#xff1a;键盘弹窗提示 lv_keyboard_set_popovers(kb,true);■ 示例二&#xff1a;设…