能够旋转的圈

简介: 能够旋转的圈

<!DOCTYPE html>
<!--
    Author:苏一恒
    Date:2019/10/24 10:53
    Motto:
        The best time to plant trees is ten years ago, followed by now. 
        种树最好的时间是十年前,其次是现在。
 -->
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>环形文字(1024节日快乐)</title>
    <style>
        body {
            background: #eeeeee;
            padding: 0;
            margin: 0;
        }
 
        #canvas {
            background: #ffffff;
 
            -webkit-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);
            -moz-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);
            box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);
            border: 1px solid rgba(0, 0, 0, 0.2);
        }
    </style>
</head>
<body>
<canvas id='canvas' width="650px" height="450px" style="width: 100%;height: 100%;">canvas not supports</canvas>
 
<script>
    'use strict';
 
    let canvas = document.getElementById('canvas'),
        context = canvas.getContext('2d'),
        //圆心半径
        CENTROID_RADIUS = 10,
        CENTROID_STROKE_STYLE = 'rgba(0, 0, 0, 0.5)',
        CENTROID_FILL_STYLE = 'rgba(80, 190, 240, 0.6)',
 
        GUIDEWIRE_STROKE_STYLE = 'goldenrod',
        GUIDEWIRE_FILL_STYLE = 'rgba(85, 190, 240, 0.6)',
 
        TEXT_FILL_STYLE = 'rgba(100, 130, 240, 0.5)',
        TEXT_STROKE_STYLE = 'rgba(200, 0, 0, 0.7)',
        TEXT_SIZE = 64,
 
        circle = {
            x: canvas.width / 2,
            y: canvas.height / 2,
            radius: 180
        },
 
        startAngle = Math.PI*2+Math.PI/2,
        endAngle = Math.PI/8+Math.PI/2,
        text = '祝各位工程师1024节日快乐。';
 
    //Function……
    /**
     * 画网格线
     * @param color
     * @param stepx
     * @param stepy
     */
    let drawGrid = (color, stepx, stepy) => {
        context.save()
 
        context.shadowColor = undefined;
        context.shadowOffsetX = 0;
        context.shadowOffsetY = 0;
 
        context.strokeStyle = color;
        context.fillStyle = '#ffffff';
        context.lineWidth = 0.5;
        context.fillRect(0, 0, context.canvas.width, context.canvas.height);
 
        for (let i = stepx + 0.5; i < context.canvas.width; i += stepx) {
            context.beginPath();
            context.moveTo(i, 0);
            context.lineTo(i, context.canvas.height);
            context.stroke();
        }
 
        for (let i = stepy + 0.5; i < context.canvas.height; i += stepy) {
            context.beginPath();
            context.moveTo(0, i);
            context.lineTo(context.canvas.width, i);
            context.stroke();
        }
 
        context.restore();
    };
 
    /**
     * 画圆心
     */
    let drawCentroid = () => {
        context.beginPath();
        context.save();
        context.strokeStyle = CENTROID_STROKE_STYLE;
        context.fillStyle = CENTROID_FILL_STYLE;
        context.textBaseline="middle";
        context.textAlign="center";
        context.font='30px Lucida Sans';
        context.fillText('By 苏一恒',circle.x, circle.y);
        // context.arc(circle.x, circle.y, CENTROID_RADIUS, 0, Math.PI * 2, false);
        context.stroke();
        context.fill();
        context.restore();
    };
 
    /**
     * 绘制环形文字
     * @param{string} string 传入的文字
     * @param startAngle 起始角
     * @param endAngle 末尾角
     */
    let drawCircularText = (string, startAngle, endAngle) => {
        let radius = circle.radius,
            angleDecrement = (startAngle - endAngle) / (string.length - 1),
            angle = parseFloat(startAngle),
            index = 0,
            character;
 
        context.save();
        context.fillStyle=TEXT_FILL_STYLE;
        context.strokeStyle=TEXT_STROKE_STYLE;
        context.font=TEXT_SIZE+'px Lucida Sans';
 
        while(index < string.length){
            //获取传入的字符串的每个字符
            character = string.charAt(index);
 
            context.save();
            context.beginPath();
            //位移到每个字符的指定位置
            context.translate(circle.x+Math.cos(angle)*radius,circle.y - Math.sin(angle)*radius);
 
            //旋转坐标系到每个字符应该达到到角度
            context.rotate(Math.PI/2-angle);
            context.fillText(character,0,0);
            context.strokeText(character,0,0);
 
            //角度递减
            angle -= angleDecrement;
 
            index++;
 
            context.restore();
        }
    };
 
 
    //Init
    let init=(startAngle,endAngle)=>{
        context.shadowOffsetX=15;
        context.shadowOffsetY=15;
        context.shadowBlur=8;
        context.shadowColor='rgba(0,0,0,0.4)';
 
        context.textAlign='center';
        context.textBaseline='middle';
 
        drawGrid('lightgray',10,10);
        drawCentroid();
        drawCircularText(text,startAngle,endAngle);
    };
    init(startAngle,endAngle);
 
    setInterval(()=> {
        context.clearRect(canvas.width,canvas.height,0,0);
        init(startAngle+=Math.PI/250,endAngle+=Math.PI/250);
    },1000/24);//24帧
 
    console.log('好吧,这里是一个彩蛋。');
    console.log('虽说ITer是擅长自黑的团体,但是呢,如果我们将"程序员"的称呼变成"工程师",那对于我们来说,在孩子面前是不是就有了更高的威望呢?');
 
</script>
</body>
</html>
相关文章
|
11天前
|
Shell
球从100米高度自由落下
这段代码计算了一个球从100米高度自由落下并在每次触地后反弹至原高度一半的过程,直至第10次落地时总共经过的距离以及第10次反弹的高度。使用循环结构累加每次落下与反弹的距离,并更新反弹高度。最终输出总距离和第10次反弹的高度。
31 5
|
2月前
|
前端开发 JavaScript
会旋转的圣诞树
这篇文章介绍了如何使用HTML、CSS和JavaScript实现一个动态旋转的圣诞树效果,包括详细的实现步骤和编码实现,以及最终效果的展示。
会旋转的圣诞树
|
2月前
|
JavaScript 前端开发
一个小球从100米落下,每次落下弹起的高度是上一次的一半,问需要几次后高度小于10米?
一个小球从100米落下,每次落下弹起的高度是上一次的一半,问需要几次后高度小于10米?
43 0
|
5月前
|
C++
一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下再反弹,求它在第10次落地时共经过多少米,第10次反弹多高。
这段内容包含两部分:代码示例和两个图片。代码是一个C++程序,主要逻辑是循环10次,每次迭代中更新变量x和y的值。图片似乎显示了代码执行前后的结果,但具体细节无法在摘要中体现。
44 0
|
5月前
56.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
56.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
45 0
一个球从 1000 米高空掉落,每次弹起高度是上一次的 50% ,弹几次后,高度低于 1 米
一个球从 1000 米高空掉落,每次弹起高度是上一次的 50% ,弹几次后,高度低于 1 米
60 0
|
前端开发 容器
3D旋转选秀盒,收纳刹那间的小美好
浏览器发展至今,在网页上呈现 3D 效果已经非常简单了,只需要我们用上一个 css 属性,就可以让我们的页面元素拥有 3D 效果,今天我们就使用这个特性来做一个 3D 旋转盒子。
99 0
求小球下落弹起的高度与路程
求小球下落弹起的高度与路程
102 0
137.正六边形螺旋图案
137.正六边形螺旋图案
60 0