【Canvas与诗词】北岛诗《献给遇罗克》节选(以太阳的名义...)

news2024/11/25 21:33:27

【成图】

【代码】

<!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="12px" height="12px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
            <img id="myImg" src="330.jpg" style="display:none;"/>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 高宽
const WIDTH=512;
const HEIGHT=512;

// 舞台对象
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){
        //sleep(100);
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){
    // 初始化
    this.init=function(){
        
    }

    // 更新
    this.update=function(){    
        
    }

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

    // 画前景
    this.paintFg=function(ctx){
        // 白底
        ctx.fillStyle = "white";
        ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);

        var r=202;
        ctx.lineWidth=2;
        var gnt1=ctx.createLinearGradient(-r,-r,r,r);
        gnt1.addColorStop(0,"rgb(255,225,83)");
        gnt1.addColorStop(1,"rgb(234,193,0)");
        ctx.strokeStyle=gnt1;
        ctx.beginPath();
        ctx.arc(0,0,r-1,0,Math.PI*2,false);
        ctx.closePath();
        ctx.stroke();
        
        // 切图圈
        ctx.save();
        ctx.rotate(-Math.PI/4*3);
        ctx.beginPath();
        var r=200;
        ctx.arc(0,0,r,0,Math.PI*2,false);
        ctx.closePath();
        ctx.clip();
        var img=document.getElementById("myImg");        
        ctx.drawImage(img,0,0,150,150,-r,-r,2*r,2*r);
        ctx.restore();

        // 锯齿纹
        var N=20;
        var gearArr=getGearArray(N,Math.PI/N,180,160);                
        ctx.beginPath();
        for(var i=0;i<gearArr.length;i++){
            ctx.lineTo(gearArr[i].x,gearArr[i].y);
        }
        ctx.closePath();
        ctx.lineWidth=6;
        ctx.strokeStyle=gnt1;
        ctx.stroke();
        ctx.fillStyle="black";
        ctx.fill();

        // 射线
        var r=178;
        var gnt2=ctx.createRadialGradient(0,0,0,0,0,r);
        gnt2.addColorStop(0,"black");
        gnt2.addColorStop(0.7,"rgb(121,100,0)");
        gnt2.addColorStop(1,"black");
        for(var i=0;i<N;i++){
            var theta=Math.PI*2/N*i;            
            var pt=createPt(r*Math.cos(theta),r*Math.sin(theta));

            var angle=theta-Math.PI/2;
            var rad=2;
            var up=createPt(pt.x+rad*Math.cos(angle),pt.y+rad*Math.sin(angle));

            angle=theta+Math.PI/2;
            var down=createPt(pt.x+rad*Math.cos(angle),pt.y+rad*Math.sin(angle));

            ctx.fillStyle=gnt2;
            ctx.beginPath();
            ctx.moveTo(0,0);
            ctx.lineTo(up.x,up.y);
            ctx.lineTo(down.x,down.y);
            ctx.closePath();
            ctx.fill();
        }

        var color="gold";//"rgb(55,65,77)";
        writeText(ctx,0,-115,"《献给遇罗克》","24px 方正宋刻本秀楷简体",color);
        writeText(ctx,93,-115,"节选","12px 方正宋刻本秀楷简体",color);
        writeText(ctx,50,-95,"北岛","12px 方正宋刻本秀楷简体",color);

        // 五星分隔线
        var left=-75;
        var right=75;
        var height=-90;
        ctx.beginPath();
        ctx.moveTo(left,height);
        ctx.lineTo(-18,height);
        ctx.closePath();
        ctx.lineWidth=1;
        ctx.strokeStyle="gold";
        ctx.stroke();        
        drawSolidFiveStar(ctx,0,height,4,"rgb(245,175,54)","rgb(247,220,55)");
        ctx.beginPath();
        ctx.moveTo(right,height);
        ctx.lineTo(18,height);
        ctx.closePath();
        ctx.lineWidth=1;
        ctx.strokeStyle="gold";
        ctx.stroke();

        // 诗歌正文
        var start=createPt(0,-50);
        var gap=35;
        writeText(ctx,start.x,start.y,"以太阳的名义","26px 方正宋刻本秀楷简体",color);
        writeText(ctx,start.x,start.y+gap,"黑暗公开地掠夺","26px 方正宋刻本秀楷简体",color);
        writeText(ctx,start.x,start.y+2*gap, "沉默依然是东方的故事","26px 方正宋刻本秀楷简体",color);
        writeText(ctx,start.x,start.y+3*gap,"人民在古老的壁画上","26px 方正宋刻本秀楷简体",color);
        writeText(ctx,start.x,start.y+4*gap,"默默地永生","26px 方正宋刻本秀楷简体",color);
        writeText(ctx,start.x,start.y+5*gap,"默默地死去","26px 方正宋刻本秀楷简体",color);

        // 五星结束线
        var left=-60;
        var right=60;
        var height=140;
        ctx.beginPath();
        ctx.moveTo(left,height);
        ctx.lineTo(-18,height);
        ctx.closePath();
        ctx.lineWidth=1;
        ctx.strokeStyle="gold";
        ctx.stroke();        
        drawSolidFiveStar(ctx,0,height,4,"rgb(245,175,54)","rgb(247,220,55)");
        ctx.beginPath();
        ctx.moveTo(right,height);
        ctx.lineTo(18,height);
        ctx.closePath();
        ctx.lineWidth=1;
        ctx.strokeStyle="gold";
        ctx.stroke();

        // 太阳光芒
        var r=210;
        var R=250;
        var gnt3=ctx.createRadialGradient(0,0,r,0,0,R);
        gnt3.addColorStop(0,"white");
        gnt3.addColorStop(0.7,"rgb(225,225,0)");
        gnt3.addColorStop(1,"rgb(255,255,170)");
    
        for(var i=0;i<N;i++){
            var theta=Math.PI*2/N*i;            
            var pt=createPt(r*Math.cos(theta),r*Math.sin(theta));

            var angle=theta-Math.PI/2;
            var rad=5;
            var up=createPt(pt.x+rad*Math.cos(angle),pt.y+rad*Math.sin(angle));

            angle=theta+Math.PI/2;
            var down=createPt(pt.x+rad*Math.cos(angle),pt.y+rad*Math.sin(angle));

            var top=createPt(R*Math.cos(theta),R*Math.sin(theta));

            ctx.fillStyle=gnt3;
            ctx.beginPath();
            ctx.lineTo(up.x,up.y);
            ctx.lineTo(down.x,down.y);
            ctx.lineTo(top.x,top.y);
            ctx.closePath();
            ctx.fill();
        }

        writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火原创","8px consolas","lightgrey");// 版权
    }
}

//-------------------------------------------------------
// 取得一个齿轮全部控制点的函数
// n:齿轮齿数
// angle:齿斜面倾角
// outerRadius:齿轮外径
// innerRadius:齿轮内径
//-------------------------------------------------------
function getGearArray(n,angle,outerRadius,innerRadius){
    // 准备齿轮数组
    var gearArr=new Array();

    for(var i=0;i<n*2;i++){
        var alpha=Math.PI/n*i;
        var bata=alpha+angle;
        var x1,y1,x2,y2;
        
        if(i%2==1){
            x1=innerRadius*Math.cos(alpha);
            y1=innerRadius*Math.sin(alpha);

            x2=outerRadius*Math.cos(bata);
            y2=outerRadius*Math.sin(bata);                
        }else{                
            x1=outerRadius*Math.cos(alpha);
            y1=outerRadius*Math.sin(alpha);

            x2=innerRadius*Math.cos(bata);
            y2=innerRadius*Math.sin(bata);
        }

        gearArr.push({x:x1,y:y1});
        gearArr.push({x:x2,y:y2});
    }

    return gearArr;
}

//-------------------------------------------------------
// 绘制实体五角星
// ctx:绘图上下文
// x,y:五星中间点坐标
// radius:五星半径
// color1:阳面颜色
// color2:阴面颜色
//-------------------------------------------------------
function drawSolidFiveStar(ctx,x,y,radius,color1,color2){
    ctx.save();
    ctx.translate(x,y);
    var N=5;// 角个数
    var R=radius;// 内径
    for(var i=0;i<N;i++){
        var theta=Math.PI*2/N*i-Math.PI/10*3;
        var a=createPt(R*Math.cos(theta),R*Math.sin(theta));
        
        var r=R*Math.sin(Math.PI/10*2)/Math.sin(Math.PI/10);
        var angle=theta+Math.PI/10*3;
        var b=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));
                
        // 填充上三角形
        ctx.fillStyle=color1;
        ctx.beginPath();
        ctx.moveTo(a.x,a.y);
        ctx.lineTo(b.x,b.y);
        ctx.lineTo(0,0);
        ctx.closePath();
        ctx.fill();

        angle=theta+Math.PI/10*4;
        var c=createPt(R*Math.cos(angle),R*Math.sin(angle));

        // 填充下三角形
        ctx.fillStyle=color2;
        ctx.beginPath();
        ctx.moveTo(0,0);            
        ctx.lineTo(b.x,b.y);
        ctx.lineTo(c.x,c.y);
        ctx.closePath();
        ctx.fill();
    }
    ctx.restore();
}

/*----------------------------------------------------------
函数:创建一个二维坐标点
x:横坐标
y:纵坐标
Pt即Point
----------------------------------------------------------*/
function createPt(x,y){
    var retval={};
    retval.x=x;
    retval.y=y;
    return retval;
}

/*----------------------------------------------------------
函数:延时若干毫秒
milliseconds:毫秒数
----------------------------------------------------------*/
function sleep(milliSeconds) {
    const date = Date.now();
    let currDate = null;
    while (currDate - date < milliSeconds) {
        currDate = Date.now();
    } 
}

/*----------------------------------------------------------
函数:书写文字
ctx:绘图上下文
x:横坐标
y:纵坐标
text:文字
font:字体
color:颜色
----------------------------------------------------------*/
function writeText(ctx,x,y,text,font,color){
    ctx.save();
    ctx.textBaseline="bottom";
    ctx.textAlign="center";
    ctx.font = font;
    ctx.fillStyle=color;
    ctx.fillText(text,x,y);
    ctx.restore();
}

/*-------------------------------------------------------------
《结局或开始——献给遇罗克》 
                      作者:北岛

我,站在这里
代替另一个被杀害的人
为了每当太阳升起
让沉重的影子象道路
穿过整个国土
悲哀的雾
覆盖着补丁般错落的屋顶
在房子与房子之间
烟囱喷吐着灰烬般的人群
温暖从明亮的树梢吹散
逗留在贫困的烟头上
一只只疲倦的手中
升起低沉的乌云
以太阳的名义
黑暗公开地掠夺
沉默依然是东方的故事
人民在古老的壁画上
默默地永生
默默地死去
呵,我的土地
你为什么不再歌唱
难道连黄河纤夫的绳索
也象崩断的琴弦
不再发出鸣响
难道时间这面晦暗的镜子
也永远背对着你
只留下星星和浮云
我寻找着你
在一次次梦中
一个个多雾的夜里或早晨
我寻找春天和苹果树
蜜蜂牵动的一缕缕微风
我寻找海岸的潮汐
浪峰上的阳光变成的鸥群
我寻找砌在墙里的传说
你和我被遗忘的姓名
如果鲜血会使你肥沃
明天的枝头上
成熟的果实
会留下我的颜色
必须承认
在死亡白色的寒光中
我,战栗了
谁愿意做陨石
或受难者冰冷的塑像
看着不熄的青春之火
在别人的手中传递
即使鸽子落到肩上
也感不到体温和呼吸
它们梳理一番羽毛
又匆匆飞去
我是人
我需要爱
我渴望在情人的眼睛里
度过每个宁静的黄昏
在摇篮的晃动中
等待着儿子第一声呼唤
在草地和落叶上
在每一道真挚的目光上
我写下生活的诗
这普普通通的愿望
如今成了做人的全部代价
一生中
我曾多次撒谎
却始终诚实地遵守着
一个儿时的诺言
因此,那与孩子的心
不能相容的世界
再也没有饶恕过我
我,站在这里
代替另一个被杀害的人
没有别的选择
在我倒下的地方
将会有另一个人站起
我的肩上是风
风上是闪烁的星群
也许有一天
太阳变成了萎缩的花环
垂放在
每一个不朽的战士
森林般生长的墓碑前
乌鸦,这夜的碎片
纷纷扬扬
-end-

作者简历
北岛,1949年出生,本名赵振开,曾用笔名:北岛,石默。祖籍浙江湖州,生于北京。  
1978年同诗人芒克创办民间诗歌刊物《今天》。
1990年旅居美国,现任教于香港中文大学。曾获得诺贝尔文学奖提名。他的诗刺穿了乌托邦的虚伪,呈现出了世界的本来面目。一句“我不相信”的呐喊,震醒了茫茫黑夜酣睡的人们。  
1969年当建筑工人,后在某公司工作。80年代末移居国外。
1978年前后,他和诗人芒克创办《今天》,成为朦胧诗的代表性诗人。
1989年4月,北岛离开大陆,先后在德国、挪威、瑞典、丹麦、荷兰、法国、美国等国家居住。
北岛曾著有多种诗集,作品被译成二十余种文字,先后获瑞典笔会文学奖、美国西部笔会中心自由写作奖、古根海姆奖学金等,并被选为美国艺术文学院终身荣誉院士。 
现任教于香港中文大学。

以上资料来自百度百科
--------------------------------------------------------------*/
//-->
</script>

END

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

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

相关文章

基类没有虚析构,即使派生类使用智能指针也一定会内存泄漏

实验 定义一个基类和一个派生类 class Base { public:virtual ~Base() default; };class Derive :public Base { public:std::shared_ptr<int> sp{new int{0},[](int *p){delete p;std::cout << "删除器" << endl;},}; };main 函数执行如下代码…

作业08.21

服务器&#xff1a; #include <myhead.h>#define SER_PORT 6666 #define SER_IP "127.0.0.1"int find_client(int *client_arr, int len, int client) {for(int i0; i<len; i){if(client_arr[i] client){return i;}}return -1; }void remove_client(int *…

Mac 使用vscode 创建vue项目后修改文件提示:权限不足,以超级用户身份重试

项目场景&#xff1a; Mac 安装了全局 vue-cli 插件后&#xff0c;使用webpack 创建vue项目&#xff0c;打开项目&#xff0c;选择信任所有文件夹&#xff0c;然后正常编写代码&#xff0c;并对项目中的文件进行修改&#xff0c;点击保存的时候提示&#xff1a;保存“webpack.…

Vue3+Ts封装类似el-dialog的对话框组件

提供11个字段对dialog组件进行控制&#xff1a; modelValue: 对话框显示隐藏控制, width: 控制对话框的宽度, height&#xff1a;控制对话框的高度, top: 控制对话框个距离顶部的距离, title: 控制对话框的标题, appendToBody: 是否将对话框添加至body, closeOnClickModa…

GX Works2的使用方法

目录&#xff1a; 1、概述 2、硬件连接 3、录入与修改程序 1&#xff09;进入编辑按F2或点击“写入模式”图标 2&#xff09;修改部分元件 3&#xff09;注释 4&#xff09;改变显示触点数 4、软仿真与在线仿真 1&#xff09;软仿真 2&#xff09;在线仿真 5、P…

Linux源码阅读笔记-USB设备驱动架构

总线速度及主机控制器 USB系统架构 USB系统主机端提供为4个引脚的A型接口&#xff0c;USB外围设备通过4个引脚的B型接口和主机端连接。那4个引脚&#xff08;一条电压线VBUS、一条地线GND、一条正方向传输数据的D和一条反方向传输数据的D-线。&#xff09;USB主机和USB设备收发…

2024年翻译神器:探索四款好用的翻译工具!

因为有了一些翻译工具的存在&#xff0c;语言障碍已经渐渐不成问题。接下来就为大家推荐几款好用的翻译工具&#xff01; 福昕在线翻译 链接&#xff1a; https://fanyi.pdf365.cn/ 福昕在线翻译以其简洁的界面和强大的翻译能力&#xff0c;成为用户跨越语言障碍的首选。它…

独立站PrestaShop安装

独立站PrestaShop安装 独立站PrestaShop安装系统需求下载PrestaShop浏览器下载命令行下载 解压PrestaShop创建数据库移动PrestaShop源码到web目录composer安装依赖包nginx配置访问域名进入安装页面选择语言许可协议系统兼容性店铺信息Content of your store系统配置数据库店铺安…

金矢之lian,非你莫蜀:金矢留学携手16所英国大学共襄成都盛会

碧海蓝天的东海岸&#xff0c;盛夏的热烈未尽&#xff0c;草书云山如锦绣的天府之国&#xff0c;初秋的凉意渐起。近一年的忙碌与等待之后&#xff0c;2024年英国秋季入学申请已近尾声&#xff0c;如愿以偿拿到了录取的同学们&#xff0c;欢欣鼓舞的进入申请签证甚至预定行程机…

nginx实例

nginx的由来 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本号是0.1.0。2019年3月11日F5 与 NGINX达成协议,F5 将收购 NGINX 的所…

NSSCTF联系记录:[SWPUCTF 2021 新生赛]crypto7

题目&#xff1a; 一共有32个字符&#xff0c;且只有数字和字母&#xff0c;可能为md5加密 得到答案

Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)

0 前言 自 60 年代末以来&#xff0c;sed 一直是 Unix 标准工具箱的一部分。 Sed在以下三种情况下特别有用&#xff1a; 编辑太大的文件&#xff0c;无法进行舒适的交互式编辑&#xff1b; 当编辑命令序列过于复杂而无法在交互模式下轻松键入时&#xff0c;可以编辑任何大小的…

【学习笔记】Day 20

一、进度概述 1、机器学习常识12-18&#xff0c;以及相关代码复现 二、详情 12、SVM&#xff08;support vector machines&#xff0c;支持向量机&#xff09; 实际上&#xff0c;支持向量机是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中&#xff0c;我们设计并实现了一个基于Django框架的学生作业提交与管理系统&#xff0c;旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架&#xff0c;因其强大的功能和灵活的架构&#xff0c;使得本系统能够快速开发并扩展。 系统功…

KeyShot 2024.2:卓越的Mac与Windows 3D渲染与动画制作软件

KeyShot 2024.2作为一款专为Mac和Windows用户设计的3D渲染与动画制作软件&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;在业界树立了新的标杆。这款软件不仅继承了KeyShot系列一贯的实时渲染和动画优势&#xff0c;还在多个方面进行了全面升级和优化&#xff0c;为3D设…

C++:二叉搜索树(binary search tree)

目录 1&#xff1a; 二叉搜索树概念 2&#xff1a;二叉搜索树操作 3&#xff1a;二叉树的模拟实现 4&#xff1a;二叉搜索树的应用 5&#xff1a;二叉搜索树的性能分析 6&#xff1a;复习前中后序遍历 7&#xff1a;二叉树进阶面试题 1&#xff1a; 二叉搜索树概念 二叉搜…

基于协同过滤算法的体育商品推荐系统_t81xg

TOC springboot618基于协同过滤算法的体育商品推荐系统_t81xg--论文 绪 论 近年来&#xff0c;随着互联网科技的进步和发展&#xff0c;人们的生活水平得到了极大的提高&#xff0c;图书的数量也在快速增加&#xff0c;以至于体育商品推荐的数量不断扩大&#xff0c;管理个性…

嵌入式学习——(Linux高级编程——线程)

线程 一、pthread 线程概述 pthread&#xff08;POSIX threads&#xff09;是一种用于在程序中实现多线程的编程接口。它与进程一样&#xff0c;可以用于实现并发执行任务&#xff0c;但与进程相比有一些不同的特点。 二、优点 1. 比多进程节省资源&#xff1a;进程在创建时…