【Canvas与艺术】三环莫比乌斯圈

news2024/12/23 18:07:10

【成图】

【代码】

<!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>
        </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);

        // L的两端颜色
        var colors=[
                    ["rgb(2,223,130)","rgb(150,254,209)" ],// 绿
                    ["rgb(255,0,128)","rgb(255,193,224)" ],// 红
                    ["rgb(0,102,204)","rgb(132,193,255)" ],// 蓝
                    ["rgb(227,140,0)","rgb(254,210,1)"   ],// 黄
                    ];

        var r=150,R=200;
        ctx.lineWidth=1;
        for(var i=0;i<3;i++){
            var theta=Math.PI*2/3*i;

            var b=createPt(R*Math.cos(theta-Math.PI*2/3),R*Math.sin(theta-Math.PI*2/3));
            var d=createPt(r*Math.cos(theta+Math.PI),r*Math.sin(theta+Math.PI));

            // 渐变色
            var gnt=ctx.createLinearGradient(b.x,b.y,d.x,d.y);            
            gnt.addColorStop(0.8,colors[i][0]);
            gnt.addColorStop(0.2,colors[i][1]);
            ctx.fillStyle=gnt;

            ctx.beginPath();
            // 位于圆心的2/3大弧
            ctx.arc(0,0,R,theta-Math.PI*2/3,theta,false);
            // 偏置的半圆弧1
            ctx.arc((R-r)*Math.cos(theta)/2,
                    (R-r)*Math.sin(theta)/2,
                    R/2+r/2,
                    theta,
                    theta+Math.PI,
                    false);
            // 位于圆心的2/3小弧
            ctx.arc(0,
                    0,
                    r,
                    theta+Math.PI,
                    theta+Math.PI*1/3,
                    true);
            // 偏置的半圆弧2
            ctx.arc((R-r)*Math.cos(theta+Math.PI*4/3)/2,
                    (R-r)*Math.sin(theta+Math.PI*4/3)/2,
                    R/2+r/2,
                    theta+Math.PI*1/3,
                    theta+Math.PI*4/3,
                    true);            
            ctx.closePath();
            ctx.fill();
        }

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


/*----------------------------------------------------------
函数:创建一个二维坐标点
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.coloradmin.cn/o/1963251.html

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

相关文章

测桃花运(算姻缘)的网站系统源码

简介&#xff1a; 站长安装本源码后只要有人在线测算&#xff0c;就可以获得收入哦。是目前市面上最火的变现利器。 本版本无后台&#xff0c;无数据。本版本为开发的逗号联盟接口版本。直接对接逗号联盟&#xff0c;修改ID就可以直接运营收费赚钱。 安装环境&#xff1a;PH…

可以个性化的网盘与相册服务 PDS

可以个性化的网盘与相册服务 PDS 什么是PDS企业版企业网盘团队管理用户管理安全策略企业设置文件设置及其他设置专属登录配置 使用建议企业网盘用户端开发者版体验感受 什么是PDS 在正式开始测评PDS之前&#xff0c;首先来了解一下什么是PDS。PDS 网盘与相册服务&#xff08;D…

Pythonic 的从远程列表中提取分支名称方法

1、问题背景 在 Git 版本控制系统中&#xff0c;我们需要经常使用 git ls-remote 命令来获取远程仓库的分支列表。 这个命令的输出通常包含分支的哈希值和分支名称&#xff0c;就像这样&#xff1a; db6ad7246abf74cb845baa60e6fe45dacf897612 HEAD 1fc347b17201054d8b5b9…

YOLOv8 基于BN层的通道剪枝

YOLOv8 基于BN层的通道剪枝 1. 稀疏约束训练 在损失项中增加对BN层的缩放系数 γ \gamma γ和偏置项 β \beta β的稀疏约束&#xff0c; λ \lambda λ系数越大&#xff0c;稀疏约束越严重 L ∑ ( x , y ) l ( f ( x ) , y ) λ 1 ∑ γ g ( γ ) λ 2 ∑ β g ( β ) L…

华杉研发九学习日记18 集合 泛型

华杉研发九学习日记18 一&#xff0c;集合框架 1.1 集合和数组的区别 集合就是在java中用来保存多个对象的容器 集合是数组的升级版&#xff0c;集合中只能放置对象[object]. 数组: 在java中用来保存多个具有相同数据类型数据的容器 数组弊端&#xff1a; 1.数组只能保存…

2024AICoding公司全景图及评分

AI Coding背景 AI coding 领域的产品和公司在 2024 年开始爆发了&#xff0c;主要涉及技术进步、市场需求和开发者生态系统的变化。 本文会从技术背景&#xff0c;市场需求&#xff0c;生态以及相关评分为大家完整梳理一下相关内容。 底层技术 大规模预训练模型 技术背景&#…

C#使用OPC组件方式和AB的PLC通信

目录 一、PLC硬件配置 1、创建PLC程序 &#xff08;1&#xff09;程序工程选择 &#xff08;2&#xff09;变量和程序 2、配置程序在模拟器中运行 &#xff08;1&#xff09;打开RSLkin Classic &#xff08;2&#xff09;仿真器配置 &#xff08;3&#xff09;PLC程序…

我终于搭建完成了我的个人网站!(仅分享,非教程)

先看看我的个人网站~ https://yaoqx.pages.devhttps://yaoqx.pages.dev 来看看我搭建的过程吧&#xff01; &#xff08;仅分享&#xff0c;非教程&#xff09; 网站技术 前端框架&#xff1a;Astro主题&#xff1a;Frosti代码托管&#xff1a;Github网页部署&#xff1a;Cl…

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码&#xff0c;中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to 然后我用终端敲ssh的命令连接&#xff0c;结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish connectio…

浮点数如何存储

一、浮点数存储格式 符号&#xff08;sign&#xff09; s是符号位&#xff0c;1表示负&#xff0c;0表示正阶码&#xff08;exponent&#xff09; E的作用是对浮点数加权&#xff0c;这个权重是2的E次幂尾数&#xff08;significand&#xff09; M是一个二进制小数 二、举例说…

被爬网站用fingerprintjs来对selenium进行反爬,怎么破?

闲暇逛乎的时候&#xff0c;看到了这个问题&#xff1a; Fingerprintjs实际上就是专门用来识别和追踪浏览器的&#xff0c;要应对起来&#xff0c;确实并非易事。那么&#xff0c;我们要如何应对FingerprintJS的唯一标记技术呢&#xff1f; 接下来&#xff0c;我们将一起来探讨…

【自学深度学习梳理2】深度学习基础

一、优化方法 上一篇说到,使用梯度下降进行优化模型参数,可能会卡在局部最小值,或优化方法不合适永远找不到具有最优参数的函数。 1、局部最小值 梯度下降如何工作? 梯度下降是一种优化算法,用于最小化损失函数,即寻找一组模型参数,使得损失函数的值最小(局部最小值…

【Python体验】第五天:目录搜索、数据爬虫(评论区里写作业)

文章目录 目录搜索 os、shutil库数据爬虫 request、re作业&#xff1a;爬取案例的top250电影的关键信息&#xff08;名称、类型、日期&#xff09;&#xff0c;并保存在表格中 目录搜索 os、shutil库 os 模块提供了非常丰富的方法用来处理文件和目录。 os.listdir(path)&#x…

STM32的外部中断实现按键控制led灯亮灭(HAL库)

一&#xff1a;stm32外部中断概述 1&#xff1a;stm32的外部中断线 STM32的每个IO都可以作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0~15&#xff1a;对应外部IO口的输入中断。 线16&#xff1a;连接到PVD输出。 线17&#xff1a;连接到R…

后端采用SpringBoot框架开发的:ADR药物不良反应智能监测系统源码,用于监测和收集药品在使用过程中发生的不良反应的系统

ADR药物不良反应智能监测系统是一套用于监测和收集药品在使用过程中发生的不良反应&#xff08;Adverse Drug Reaction, ADR&#xff09;的系统。该系统基于医院临床数据中心&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能&#x…

【Python学习手册(第四版)】学习笔记11.2-表达式语句(print函数)及打印操作(重定向等)详解

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 主要介绍表达式语句&#xff08;print函数&#xff09;及打印操作&#xff08;重定向等&#xff09;。视需要选择目录阅读。 目录 表达式语句 错误示例&#xf…

实验3-7 统计学生成绩

//实验3-7 统计学生成绩 /* 本题要求编写程序读入N个学生的百分制成绩&#xff0c;统计五分制成绩的分布。 百分制成绩到五分制成绩的转换规则&#xff1a;大于等于90分为A&#xff1b;小于90且大于等于80为B&#xff1b;小于80且大于等于70为C&#xff1b;小于70且大于等于60为…

相机标定(Camera Calibration)

什么是 相机标定&#xff08;Camera Calibration&#xff09;&#xff1f; 相机标定&#xff08;CameraCalibration&#xff09;是确定相机内部参数&#xff08;如焦距、光学中心、畸变系数等&#xff09;和外部参数&#xff08;如相机在世界坐标系中的位置和姿态&#xff09;的…

黑马头条vue2.0项目实战(三)——个人中心功能的实现

1. Tabbar 处理 通过分析页面&#xff0c;可以看到&#xff0c;首页、问答、视频、我的 都使用的是同一个底部标签栏&#xff0c;我们没必要在每个页面中都写一个&#xff0c;所以为了通用方便&#xff0c;我们可以使用 Vue Router 的嵌套路由来处理。 父路由&#xff1a;一个…

激发潜能,Vatee万腾平台驱动企业持续发展

在当今这个日新月异的商业环境中&#xff0c;企业要想保持竞争力并实现持续发展&#xff0c;就必须不断挖掘自身潜能&#xff0c;探索新的增长点。而Vatee万腾平台&#xff0c;正是这样一位能够激发企业潜能、驱动其持续发展的强大伙伴。 一、智能化赋能&#xff0c;解锁企业潜…