【Canvas與盾牌】“靡不有初,鮮克有終”黃豎條盾牌

【成圖】

1

2

3

4

5

【代碼】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>黃豎條盾牌 Draft1</title><style type="text/css">.centerlize{margin:0 auto;width:1200px;}</style></head><body onload="init();"><div class="centerlize"><canvas id="myCanvas" width="12px" height="12px" style="border:1px dotted black;">如果看到這段文字說您的瀏覽器尚不支持HTML5 Canvas,請更換瀏覽器再試.</canvas></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.save();ctx.fillStyle = "white";ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);ctx.restore();*/const R=160;//基準尺寸var ct=createPt(0,0);// ct=center// #1 黑圈ctx.save();    var r=R*1.00;var w=r*2.4;var h=r*3;ctx.fillStyle="black";drawShield(ctx,0,0,w,h,w*0.05);ctx.fill();ctx.restore();// #2 上下漸變黃圈ctx.save();    w-=0.04*r;h-=0.04*r;var gnt=ctx.createLinearGradient(0,-h/2,0,h/2);gnt.addColorStop(0,"rgb(187,149,86)");gnt.addColorStop(0.5,"rgb(252,244,169)");gnt.addColorStop(1,"rgb(162,91,35)");ctx.fillStyle=gnt;drawShield(ctx,0,0,w,h,w*0.04);ctx.fill();ctx.restore();// #3 上下漸變白黃圈ctx.save();    w-=0.08*r;h-=0.08*r;var gnt=ctx.createLinearGradient(0,-h/2,0,h/2);gnt.addColorStop(0,"rgb(253,250,245)");gnt.addColorStop(0.49,"rgb(232,209,178)");gnt.addColorStop(0.5,"rgb(96,60,38)");gnt.addColorStop(1,"rgb(255,227,162)");ctx.fillStyle=gnt;drawShield(ctx,0,0,w,h,w*0.03);ctx.fill();ctx.restore();// #4 黑圈ctx.save();    w-=0.08*r;h-=0.08*r;ctx.fillStyle="black";drawShield(ctx,0,0,w,h,w*0.02);ctx.fill();ctx.restore();// #5 上下漸變白黃圈ctx.save();    w-=0.04*r;h-=0.04*r;var gnt=ctx.createLinearGradient(0,-h/2,0,h/2);gnt.addColorStop(0,"rgb(253,250,245)");gnt.addColorStop(0.49,"rgb(232,209,178)");gnt.addColorStop(0.5,"rgb(96,60,38)");gnt.addColorStop(1,"rgb(255,227,162)");ctx.fillStyle=gnt;drawShield(ctx,0,0,w,h,w*0.015);ctx.fill();ctx.restore();// #6 輻射漸變圈ctx.save();    w-=0.08*r;h-=0.08*r;var gnt=ctx.createRadialGradient(0,0,0,0,0,r*1.5);gnt.addColorStop(0,"rgb(246,234,98)");gnt.addColorStop(1,"rgb(63,60,25)");ctx.fillStyle=gnt;drawShield(ctx,0,0,w,h,w*0);ctx.fill();ctx.restore();// 五星ctx.save();    drawSolidCircle(ctx,0,0,r*0.6,"black");drawSolidCircle(ctx,0,0,r*0.59,gnt);drawSolidCircle(ctx,0,0,r*0.57,"black");drawSolidCircle(ctx,0,0,r*0.55,gnt);drawSolidCircle(ctx,0,0,r*0.50,"black");drawSolidCircle(ctx,0,0,r*0.46,gnt);ctx.fillStyle="black";draw5Star(ctx,0,0,r*0.46);ctx.fill();draw2Color5Star(ctx,0,0,r*0.44,gnt,"red");ctx.restore();// #7 文字ctx.save();        var r=R*0.78;var poemTxt="靡不有初;;;;鮮克有終";drawPoem(ctx,0,0,w,h,r*0.3,r*0.3,r*0.00,-r*0.00,poemTxt,r*0.32+"px 方正宋刻本秀楷簡體","rgb(251,230,183)");// 前景文ctx.restore();// #6 豎線條ctx.save();    drawShield(ctx,0,0,w,h,w*0);ctx.clip();var n=40;for(var i=0;i<n;i++){var x=-w/2+i*w/n;ctx.strokeStyle="black";ctx.beginPath();ctx.moveTo(x,-h/2);ctx.lineTo(x,+h/2);ctx.stroke();}ctx.restore();// #8 覆蓋ctx.save();    drawShield(ctx,0,0,w,h,0);ctx.clip();ctx.fillStyle="rgba(190,190,190,0.2)";ctx.fillRect(0,-h/2,w/2,h);ctx.restore();writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火制圖","8px consolas","lightgrey");// 版權}
}/*--------------------------------------------------
函數:繪制正五角星
ctx:繪圖上下文
x:五角星中心橫坐標
y:五角星中心縱坐標
R:五角星中心到頂點的距離
---------------------------------------------------*/
function draw5Star(ctx,x,y,R){var r=R*Math.sin(Math.PI/10)/Math.sin(Math.PI/10*7);var arr=[0,0,0,0,0,0,0,0,0,0];// 頂五點for(var i=0;i<5;i++){var theta=i*Math.PI/5*2-Math.PI/10;var x1=R*Math.cos(theta)+x;var y1=R*Math.sin(theta)+y;arr[i*2]=createPt(x1,y1);}// 內五點for(var i=0;i<5;i++){var theta=i*Math.PI/5*2+Math.PI/10;var x1=r*Math.cos(theta)+x;var y1=r*Math.sin(theta)+y;arr[i*2+1]=createPt(x1,y1);}ctx.beginPath();for(var i=0;i<arr.length;i++){ctx.lineTo(arr[i].x,arr[i].y);}ctx.closePath();
}/*--------------------------------------------------
函數:繪制雙色正五角星
ctx:繪圖上下文
x:五角星中心橫坐標
y:五角星中心縱坐標
R:五角星中心到頂點的距離
fillColor1:填充色
fillColor2:填充色
---------------------------------------------------*/
function draw2Color5Star(ctx,x,y,R,fillColor1,fillColor2){ctx.save();    var r=R*1.00;// 半徑var center=createPt(x,y);// 中心點var N=5;// 角數var part=Math.PI*2/5;// 每次偏轉角for(var i=0;i<N;i++){var theta=part*i-Math.PI/10;var a=createPt2(center.x,center.y,r,theta);var b=createPt2(a.x,a.y,r*Math.sin(Math.PI/5)/Math.sin(Math.PI/10*7),theta+Math.PI/10*9);var c=createPt(center.x,center.y);var d=createPt2(a.x,a.y,r*Math.sin(Math.PI/5)/Math.sin(Math.PI/10*7),theta-Math.PI/10*9);                    ctx.fillStyle=fillColor1;ctx.beginPath()ctx.lineTo(a.x,a.y);ctx.lineTo(c.x,c.y);ctx.lineTo(d.x,d.y);ctx.closePath();ctx.fill();ctx.fillStyle=fillColor2;ctx.beginPath()ctx.lineTo(a.x,a.y);ctx.lineTo(c.x,c.y);ctx.lineTo(b.x,b.y);ctx.closePath();ctx.fill();}ctx.restore();
}/*----------------------------------------------------------
函數:函數化寫詩
ctx:繪圖上下文
x:矩形中心橫坐標
y:矩形中心縱坐標
width:矩形寬
height:矩形高
(以上四個變量控制了詩文所在的矩形范圍)
horizontalMagin:左右留白
verticalMagin:上下留白
xOffset:文本的水平偏移值
yOffset:文本的垂直偏移值
text:詩文文本(以英文半角空格作為分隔符,分隔后的數組長度為列數,最長一句的文本書為行數)
font:字體
color:顏色
----------------------------------------------------------*/
function drawPoem(ctx,x,y,width,height,horizontalMagin,verticalMagin,xOffset,yOffset,text,font,color){height-=2*verticalMagin;        // 高width-=2*horizontalMagin;       // 寬var arr=text.split(";");        // 存儲單個文字的數組var cols=arr.length;            // 列數    var rows=-1;                    // 定義行數for(var i=0;i<arr.length;i++){  // 取得行數var line=arr[i];var len=line.split("").length;if(len>rows){rows=len;}}var xStep=width/cols;            // 橫向步進var yStep=height/rows;            // 豎向步進// 寫詩for(var i=0;i<cols;i++){        for(var j=0;j<rows;j++){var a=createPt(x+width/2-(i+0.5)*xStep,y-height/2+(j+0.5)*yStep);// 定位var line=arr[i];         // 取得每一行var words=line.split("");// 代表每一行的數組if(j<line.length){var word=words[j];   // 具體的行列對應的字writeText(ctx,a.x,a.y+yOffset,word,font,color);}}}
}/*----------------------------------------------------------
函數:用于繪制盾牌外輪廓,可控制圓角大小,使轉折處厚邊可調
ctx:繪圖上下文
x:盾牌中心橫坐標
y:盾牌中心縱坐標
w:盾牌寬
h:盾牌高
roundRadius:圓角半徑
----------------------------------------------------------*/
function drawShield(ctx,x,y,w,h,roundRadius){var ct=createPt(x,y);    // 定點var a=createPt(ct.x,-h/2);var e=createPt(ct.x,h/2);var b=createPt2(a.x,a.y,w/2/Math.cos(Math.PI/12),Math.PI/12*11);var b1=createPt2(b.x,b.y,roundRadius,-Math.PI/12);var b2=createPt2(b.x,b.y,roundRadius,Math.PI/2);var h=createPt2(a.x,a.y,w/2/Math.cos(Math.PI/12),Math.PI/12);var h1=createPt2(h.x,h.y,roundRadius,Math.PI/2);var h2=createPt2(h.x,h.y,roundRadius,Math.PI/12*13);var c=createPt(b.x,ct.y+w*0.1);var d=createPt2(e.x,e.y,w/2/Math.cos(Math.PI/9),Math.PI/9*10);var f=createPt2(e.x,e.y,w/2/Math.cos(Math.PI/9),-Math.PI/9);var g=createPt(h.x,ct.y+w*0.1);// 勾線ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.lineTo(b1.x,b1.y);ctx.quadraticCurveTo(b.x,b.y,b2.x,b2.y);ctx.lineTo(c.x,c.y);ctx.quadraticCurveTo(d.x,d.y,e.x,e.y);ctx.lineTo(e.x,e.y);ctx.quadraticCurveTo(f.x,f.y,g.x,g.y);ctx.lineTo(h1.x,h1.y);ctx.quadraticCurveTo(h.x,h.y,h2.x,h2.y);ctx.lineTo(a.x,a.y);ctx.closePath();
}/*----------------------------------------------------------
基本函數:用于繪制實心圓
ctx:繪圖上下文
x:矩形中心橫坐標
y:矩形中心縱坐標
r:圓半徑
style:填充圓的方案
----------------------------------------------------------*/
function drawSolidCircle(ctx,x,y,r,style){ctx.fillStyle=style;ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2,false);ctx.closePath();ctx.fill();
}/*----------------------------------------------------------
基本函數:用于繪制矩形
ctx:繪圖上下文
x:矩形中心橫坐標
y:矩形中心縱坐標
width:矩形寬
height:矩形高
----------------------------------------------------------*/
function drawRect(ctx,x,y,width,height){ctx.beginPath();ctx.moveTo(x-width/2,y-height/2);ctx.lineTo(x+width/2,y-height/2);ctx.lineTo(x+width/2,y+height/2);ctx.lineTo(x-width/2,y+height/2);ctx.closePath();
}/*----------------------------------------------------------
基本函數:創建一個二維坐標點
baseX:基準點橫坐標
baseY:基準點縱坐標
radius:當前點到基準點的距離
theta:當前點到基準點的角度
Pt即Point
----------------------------------------------------------*/
function createPt2(baseX,baseY,radius,theta){var retval={};retval.x=baseX+radius*Math.cos(theta);retval.y=baseY+radius*Math.sin(theta);return retval;
}/*----------------------------------------------------------
基本函數:創建一個二維坐標點
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();
}/*-------------------------------------------------------------
靡不有初,鮮克有終最早出自于《詩經·大雅·蕩》。 
靡不有初,鮮克有終是指事情都有個開頭,
但很少能到終了。多用以告誡人們為人做事要善始善終。
--------------------------------------------------------------*/
//-->
</script>

END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94627.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用linux+javascript+html+mysql+nodejs+npm+express等構建信息資料采集系統

一、適用場景 1、人才信息庫、檔案管理&#xff0c;構建企業或單位內部人才庫。 2、公務員/事業單位招聘&#xff0c;網上報名填寫資料、上傳證書等。 3、科研項目申報&#xff0c;課題負責人信息、成果附件、審查材料上傳。 4、志愿者招募&#xff1a;在線填寫報名信息&#…

低空經濟產業白皮書:音視頻鏈路在智能飛行體系中的核心地位

引言 低空經濟正在成為繼數字經濟、新能源產業之后的又一戰略制高點。它不僅意味著無人機物流、空中通勤、應急救援、文旅體驗等新業態的興起&#xff0c;更代表著 城市治理、智能制造、公共服務全面進入空域數字化時代。從政策引導到產業投資&#xff0c;從技術突破到應用創新…

【LeetCode 熱題 100】32. 最長有效括號——(解法二)動態規劃

Problem: 32. 最長有效括號 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(N)空間復雜度&#xff1a;O(N)整體思路 這段代碼同樣旨在解決 “最長有效括號” 問題&#xff0c;但它采用的是一種 動態規劃 (Dynamic Programming) 的方法。這種方法通過構建一個DP表…

使用Docker部署ZLMediaKit流媒體服務器實現gb/t28181協議的設備

最近在研究一個攝像頭&#xff0c;通信協議是 gb/t28181。對于這個協議也是第一次接觸&#xff0c;通過查閱多方資料&#xff0c;找到了兩個開源的源碼&#xff0c;來實現 視頻播放、攝像頭直播。以前也沒有深入的了解過關于視頻播放的這方面的技術&#xff0c;偶爾網站播放視頻…

硬件三人行--運算基礎篇

第3講 負反饋放大電路

【LINUX網絡】TCP原理

目錄 本文介紹 1. 什么是TCP&#xff1f; 2. TCP結構 為什么需要協議棧&#xff1a;兩臺主機通信的復雜性解決方案 3. 確認應答機制 進一步理解什么是確認和請求以及序號 進一步理解什么是序號和確認序號 并發發送帶來的問題以及解決方案&#xff08;序號&#xff09; …

Java -- 文件基礎知識--Java IO流原理--FileReader

目錄 1. 常用文件操作 2. Java IO流原理 2.1 流的分類 3. FileReader和FileWriter介紹 FileReader相關方法&#xff1a; FileWriter常用方法&#xff1a; 文件是保存數據的地方&#xff0c;比如大家經常使用的word文檔&#xff0c;txt文件&#xff0c;excel文件...都是文…

向量方法證明正余弦定理的數學理論體系

向量方法證明正余弦定理的數學理論體系 摘要&#xff1a; 向量理論為幾何定理的證明提供了強有力的代數化工具。本文基于向量空間的基本概念與運算性質&#xff0c;嚴格推導平面幾何中的正弦定理與余弦定理。通過建立系統的向量表示框架&#xff0c;將幾何關系轉化為向量運算&a…

【筆記ing】大模型算法架構

前言 隨著人工智能技術的飛速發展,大模型算法及其架構已成為推動科技前沿的重要力量。它們不僅能夠處理海量的數據,還具備強大的表征學習能力,能夠應對日益復雜的場景需求。本章節將介紹大模型算法及其架構,帶您了解其背后的原理、技術創新以及在實際應用中的廣闊前景。 …

ConcurrentHashMap的原理

1.底層數據結構JDK1.7底層采用分段的數組鏈表實現JDK1.8 采用的數據結構跟HashMap1.8的結構一樣,數組鏈表/紅黑二叉樹2.加鎖的方式JDK1.7采用Segment分段鎖,底層使用的是ReentrantLockJDK1.8采用CAS添加新節點,采用synchronized鎖定鏈表或紅黑二叉樹的首節點,相對Segment分段鎖…

【論文閱讀】健全個體無輔助運動期間可穿戴傳感器雙側下肢神經機械信號的基準數據集

Benchmark Datasets for Bilateral Lower-Limb Neuromechanical Signals from Wearable Sensors during Unassisted Locomotion in Able-Bodied Individuals 原文&#xff1a;DOI&#xff1a; 10.3389/frobt.2018.00014 2018年 翻譯&#xff1a;靠岸學術 目錄 1引言 2儀器設…

反向海淘系統搭建:從架構設計到合規運營的全方位指南

一、系統架構設計1.1 分層架構設計反向海淘系統通常采用四層架構設計&#xff1a;?接入層?&#xff1a;負責與淘寶開放平臺、1688海外接口通信&#xff0c;處理接口認證、請求轉發與響應解析。?業務層?&#xff1a;包含商品檢索、訂單管理、支付處理、物流追蹤等核心模塊。…

20.22 QLoRA微調實戰:中文語音識別數據準備全流程解密

QLoRA微調實戰:中文語音識別數據準備全流程解密 實戰項目:QLoRA 微調數據準備詳解 本環節我們將以中文語音識別任務為場景,詳細拆解 QLoRA 微調前的數據準備流程。以下流程圖展示了完整的數據處理路徑: #mermaid-svg-A3ZpWn1ysZUg6jg4 {font-family:"trebuchet ms&q…

工業電子看板賦能線纜工廠生產高效運轉

在制造業智能化轉型的浪潮中&#xff0c;工業電子看板已不再只是“顯示數據的屏幕”&#xff0c;而是成為連接設備層、控制層與管理層的實時信息樞紐。尤其在線纜制造這類對工藝參數敏感、生產連續性要求高的行業中&#xff0c;電子看板通過對關鍵數據的透明化、實時化與交互化…

Java爬蟲是什么,如何獲取API接口

一、Java爬蟲的定義Java爬蟲是一種基于Java編程語言開發的網絡爬蟲程序。它通過模擬瀏覽器行為&#xff0c;向目標網站發送HTTP請求&#xff0c;獲取網頁內容并解析出所需數據。Java爬蟲技術廣泛應用于數據采集、市場分析、競爭情報等領域。二、Java爬蟲獲取API接口的方法&…

Python篇---返回類型

基礎返回類型&#xff1a;在 Python 中&#xff0c;函數的返回類型就像函數 “產出” 的不同 “物品”&#xff0c;理解它們能幫你更好地控制代碼的輸出。下面用通俗的方式介紹常見的返回類型及用法&#xff1a;一、最基礎的返回類型1. 無返回值&#xff08;None&#xff09;特…

ArkTS 與 TypeScript 的關系及鴻蒙開發常見錯誤案例

隨著 HarmonyOS NEXT&#xff08;純血鴻蒙&#xff09; 的到來&#xff0c;開發者在學習鴻蒙應用開發時會遇到一個新的語言 —— ArkTS。很多人會疑惑&#xff1a;它和 TypeScript&#xff08;TS&#xff09;是什么關系&#xff1f;又有哪些新的特性&#xff1f;在實際開發中&a…

初識socket編程(實現一個簡單的TCPServer)

監聽套接字的創建流程 在網絡編程中&#xff0c;listen 套接字&#xff08;通常稱為“監聽套接字”&#xff09;是服務器端用于接收客戶端連接請求的特殊套接字&#xff0c;是 TCP 服務器建立連接過程中的核心組件。下面我們就來簡單看一下監聽套接字創建的過程創建流程&#x…

開發者如何在 Gitee 上開源一個自己的項目

文章目錄一、為什么要在 Gitee 上開源&#xff1f;1. 開源的價值2. 為什么是 Gitee&#xff1f;二、前期準備&#xff1a;讓項目“可開源”1. 項目代碼整理2. 添加必要文件3. 確定開源許可證三、在 Gitee 上創建倉庫四、推送本地代碼到 Gitee五、完善項目展示&#xff08;吸引力…

卷積神經網絡實現mnist手寫數字集識別案例

手寫數字識別是計算機視覺領域的“Hello World”&#xff0c;也是深度學習入門的經典案例。它通過訓練模型識別0-9的手寫數字圖像&#xff08;如MNIST數據集&#xff09;&#xff0c;幫助我們快速掌握神經網絡的核心流程。本文將以PyTorch框架為基礎&#xff0c;帶你從數據加載…