用HTML5 + JavaScript绘制花、树

news2024/10/6 3:16:01

用HTML5 + JavaScript绘制花、树

<canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。

<canvas> 标签/元素只是图形容器,必须使用脚本来绘制图形。

HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112916903

下面展示了如何使用 HTML5 的 <canvas> 标签/元素以及 JavaScript 来绘制花、树等效果。

一、画花

花1、先给出运行效果图:

源码如下:

<!DOCTYPE html>
<html>
<head>
  <title>Canvas绘制花朵</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="400" height="400"></canvas>

  <script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    // 绘制花朵:花朵中心的x坐标;花朵中心的y坐标;radius花朵的半径;petalCount花瓣的数量;petalColor花瓣的颜色;centerColor花朵中心的颜色
    function drawFlower(x, y, petalCount, petalColor, centerColor) {
      // 绘制花朵的中心
      context.beginPath();
      context.arc(x, y, 10, 0, Math.PI * 2, true);
      context.fillStyle = centerColor;
      context.fill();

      var angle = (Math.PI * 2) / petalCount;
      for (var i = 0; i < petalCount; i++) {
        context.beginPath();
        var startX = x + Math.cos(angle * i) * 10;
        var startY = y + Math.sin(angle * i) * 10;
        var cp1X = x + Math.cos(angle * i - angle / 4) * 50;
        var cp1Y = y + Math.sin(angle * i - angle / 4) * 50;
        var cp2X = x + Math.cos(angle * i + angle / 4) * 50;
        var cp2Y = y + Math.sin(angle * i + angle / 4) * 50;

        context.moveTo(startX, startY);
        //绘制了花瓣
        context.bezierCurveTo(cp1X, cp1Y, cp2X, cp2Y, startX, startY);
        context.fillStyle = petalColor;
        context.fill();
        //花径
        context.moveTo(x, y + 10);
        context.lineTo(x, y + 60);
        context.stroke();

        context.strokeStyle = 'DarkCyan'; // 设置颜色

      }
    }

    // 调用函数进行绘制
    drawFlower(200, 200, 6, "green", "red");
    drawFlower(250, 300, 8, "green", "red");
  </script>
</body>
</html>

花2、先给出运行效果图:

源码如下:

<!DOCTYPE html>
<html>
<head>
  <title>Canvas绘制花朵</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="800" height="600"></canvas>

  <script>

    // 绘制花朵:x和y定义了花朵中心的位置,radius花朵的半径,petalCount花瓣的数量,petalColor花瓣的颜色,centerColor花朵中心的颜色。
    function drawFlower(x, y, radius,petalCount, petalColor, centerColor) {
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        context.lineWidth = 2;
        context.strokeStyle = "pink";

        //花瓣
        context.fillStyle = petalColor;
        for (var i = 0; i < petalCount; i++) {
            context.beginPath();
            var angle = (2 * Math.PI / petalCount) * i;
            var petalX = x + Math.cos(angle) * radius;
            var petalY = y + Math.sin(angle) * radius;
            context.arc(petalX, petalY, radius, 0, 2 * Math.PI);
            context.stroke();
            context.fill();
        }

        //花蕊
        context.beginPath();
        context.fillStyle = centerColor;
        context.arc(x, y, radius, 0, 2 * Math.PI);
        context.stroke();
        context.fill();


        //叶子
        context.beginPath();
        context.fillStyle = "green";
        context.arc(x, y + 3 * radius, radius*1.5, 0, Math.PI, false);
        context.closePath();
        context.fill();
        context.beginPath();
        context.fillStyle = "white";  // 使用白色来覆盖原有的大半圆,形成月牙形
        context.arc(x, y + 2.7 * radius, radius*1.5, 0, Math.PI, false);
        context.closePath();
        context.fill();

        //花径
        context.beginPath();
        context.lineWidth = radius/10; // 设置线宽
        context.strokeStyle = 'DarkCyan'; // 设置颜色
        context.moveTo(x, y + radius);
        context.lineTo(x, y + 6 * radius);
        context.stroke();

    }


    // 调用函数进行绘制
    drawFlower(500, 250, 30, 4,"#ED6E91", "#f90");
    drawFlower(250, 300, 8, 6, "pink", "red");
  </script>
</body>
</html>

二、画树

树1先给出运行效果图:

源码如下:

<!DOCTYPE html>
<html>
<head>
  <title>Canvas绘制树</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="800" height="600"></canvas>

  <script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    // 绘制树
    function drawTree(x, y, len, angle, branchWidth) {
      context.beginPath();
      context.save();
      context.strokeStyle = "#8B4513";
      context.fillStyle = "brown";
      context.lineWidth = branchWidth;
      context.translate(x, y);
      context.rotate(angle * Math.PI / 180);
      context.moveTo(0, 0);
      context.lineTo(0, -len);
      context.stroke();

      if (len < 10) {
        context.beginPath();
        context.arc(0, -len, 5, 0, Math.PI * 2, false);  // 树叶
        context.fillStyle = "green";
        context.fill();
        context.restore();
        return;
      }

      drawTree(0, -len, len * 0.8, angle - 15, branchWidth * 0.8);
      drawTree(0, -len, len * 0.8, angle + 15, branchWidth * 0.8);

      context.restore();
    }

    // 调用函数进行绘制
    drawTree(400, 600, 90, 0, 12);

 
  </script>
</body>
</html>

说明:绘制树的函数drawTree(x, y, len, angle, branchWidth),其中参数的含义

x 和 y 参数是树枝的起始点的坐标。在最开始的调用中,这个坐标通常是树的基部。在递归调用中,这个坐标是新的树枝的起点,也就是上一级树枝的终点。

len 参数是树枝的长度。在每次递归调用中,这个长度会减小一些,表示新的树枝比上一级的树枝短一些。

angle 参数是树枝的角度。在最开始的调用中,这个角度通常是 0,表示树直立。在递归调用中,这个角度会有所改变,表示新的树枝相对于上一级的树枝有一个角度。

branchWidth 参数是树枝的宽度。在每次递归调用中,这个宽度会减小一些,表示新的树枝比上一级的树枝细一些。

这个函数首先会在给定的起点和角度处绘制一段长度和宽度为给定值的树枝,然后在这个树枝的终点处递归地绘制两个新的树枝,这两个新的树枝的角度分别向左和向右偏移一定的角度。这个过程一直进行,直到树枝的长度小于一个给定的阈值(在这个例子中是 10)。当达到阈值时,绘制一个绿色的小圆形表示树叶。

树2、是对树1,添加花朵。先给出运行效果图:

源码如下:

<!DOCTYPE html>
<html>
<head>
  <title>Canvas绘制树</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="800" height="600"></canvas>

  <script>
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    // 绘制树
    function drawTree(x, y, len, angle, branchWidth) {
      context.beginPath();
      context.save();
      context.strokeStyle = "#8B4513";
      context.fillStyle = "brown";
      context.lineWidth = branchWidth;
      context.translate(x, y);
      context.rotate(angle * Math.PI / 180);
      context.moveTo(0, 0);
      context.lineTo(0, -len);
      context.stroke();

      if (len < 10) {
        context.beginPath();
        context.arc(0, -len, 5, 0, Math.PI * 2, false);  // 树叶
        context.fillStyle = "green";
        context.fill();
        context.restore();
        return;
      }

      drawTree(0, -len, len * 0.8, angle - 15, branchWidth * 0.8);
      drawTree(0, -len, len * 0.8, angle + 15, branchWidth * 0.8);

      context.restore();
    }


    // 绘制花朵
    function drawFlower(x, y, petalCount, petalColor, centerColor) {
      // 绘制花朵的中心
      context.beginPath();
      context.arc(x, y, 8, 0, Math.PI * 2, true);
      context.fillStyle = centerColor;
      context.fill();

      var angle = (Math.PI * 2) / petalCount;
      for (var i = 0; i < petalCount; i++) {
        context.beginPath();
        var startX = x + Math.cos(angle * i) * 10;
        var startY = y + Math.sin(angle * i) * 10;
        var cp1X = x + Math.cos(angle * i - angle / 4) * 30;
        var cp1Y = y + Math.sin(angle * i - angle / 4) * 30;
        var cp2X = x + Math.cos(angle * i + angle / 4) * 30;
        var cp2Y = y + Math.sin(angle * i + angle / 4) * 30;

        context.moveTo(startX, startY);
        context.bezierCurveTo(cp1X, cp1Y, cp2X, cp2Y, startX, startY);
        context.fillStyle = petalColor;
        context.fill();
      }
    }

    // 调用函数进行绘制
    drawTree(400, 600, 90, 0, 12);
    drawFlower(400, 250, 6, "DeepPink", "red");
    drawFlower(250, 400, 6, "DeepPink", "red");
    drawFlower(550, 400, 6, "DeepPink", "red");
 
  </script>
</body>
</html>

附录

更多例子可见:https://blog.csdn.net/cnds123/article/details/112392014

关于 HTML的元素、标签和属性 是什么,可见https://blog.csdn.net/cnds123/article/details/125745562

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

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

相关文章

【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1449. 数位成本和为目标值的最大数字 给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数&#xff1a; 给当前结果添加…

前端面试题——二叉树遍历

前言 二叉树遍历在各种算法和数据结构问题中都有广泛的应用&#xff0c;如二叉搜索树、表达式的树形表示、堆的实现等。同时也是前端面试中的常客&#xff0c;掌握好二叉树遍历算法对于一名合格的前端工程师来说至关重要。 概念 二叉树遍历&#xff08;Binary Tree Traversa…

【c语言】字符串常见函数 上

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

Linux中FIFO管道

介绍&#xff1a; FIFO被称为命名管道&#xff0c;pipe只能用于有血缘关系的进程间通信&#xff0c;但通过FIFO&#xff0c;不相关的进程也可以进程间通信。 FIFO是linux基础文件类型的一种&#xff08;文件类型为p&#xff09;&#xff0c;FIFO文件在磁盘上没有数据块&#…

【Java八股面试系列】JVM-类和对象加载过程

目录 类和对象的加载过程 类的生命周期 类的加载过程 加载 验证 准备 解析 初始化 类卸载 对象的加载过程 类和对象的加载过程 什么是类加载和对象加载? 类加载&#xff08;Class Loading&#xff09;&#xff1a;这是指JVM在运行时将类的字节码文件加载到内存中的…

2000-2021年县域指标统计数据库

2000-2021年县域统计数据库 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;县域统计年鉴 3、范围&#xff1a;2500县 5、指标&#xff1a; 地区名称、年份、行政区域代码、所属城市、所属省份、行政区域土地面积平方公里、乡及镇个数个、乡个数个、镇个数个、街道办…

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想&#xff1a; 从头到尾依次读取中缀表达式里的每个对象&#xff0c;对不同对象按照不同的情况处理。 如果遇到空格&#xff0c;跳过如果遇到运算数字&#xff0c;直接输出如果遇到左括号&#xff0c;压栈如果遇到右括号&#xff0c;表示括号里的中缀表达式已经扫描完毕&a…

物联网和工业4.0

在当今这个快速发展的技术时代&#xff0c;物联网&#xff08;IoT&#xff09;和工业4.0成为了推动全球进入新工业时代的两大驱动力。对于刚入行的人来说&#xff0c;深入理解这两个概念及其背后的技术原理&#xff0c;对于把握未来的职业机会至关重要。 物联网&#xff0c;简…

【JavaEE】_CSS常用属性

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

java+SSM+Mysql学院教室管理系统81671-计算机毕业设计项目选题推荐(免费领源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;山西能源学院教室管理系统当然也不能排除在外。山西能源学院教室管理系统是以实际运用为开发背景&#xff0c;运用软件工…

【Web】Redis未授权访问漏洞学习笔记

目录 简介 靶机配置 Redis持久化 Redis动态修改配置 webshell 反弹shell Redis写入反弹shell任务 加固方案 简介 Redis&#xff08;Remote Dictionary Server 远程字典服务器&#xff09;是一个开源的内存数据库&#xff0c;也被称为数据结构服务器&#xff0c;它支持…

【动态规划】【数组】1416. 恢复数组

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 动态规划汇总 LeetCode1416. 恢复数组 某个程序本来应该输出一个整数数组。但是这个程序忘记输出空格了以致输出了一个数字字符串&#xff0c;我们所知道的信息只有&#xff1a;…

C++初阶:容器(Containers)list常用接口详解

介绍完了vector类的相关内容后&#xff0c;接下来进入新的篇章&#xff0c;容器list介绍&#xff1a; 文章目录 1.list的初步介绍2.list的定义&#xff08;constructor&#xff09;3.list迭代器&#xff08; iterator &#xff09;4.string的三种遍历4.1迭代器4.2范围for循环 5…

随机过程及应用学习笔记(二)随机过程的基本概念

随机过程论就是研究随时间变化的动态系统中随机现象的统计规律的一门数学学科。 目录 前言 一、随机过程的定义及分类 1、定义 2、分类 二、随机过程的分布及其数字特征 1、分布函数 2、数字特征 均值函数和方差函数 协方差函数和相关函数 3、互协方差函数与互相关函…

Java 基于 SpringBoot 的大药房管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

图表自动化开篇

目录 前言&#xff1a; 使用 Canvas 或者 SVG 渲染 选择哪种渲染器 代码触发 ECharts 中组件的行为 前言&#xff1a; 图表自动化一直以来是自动化测试中的痛点&#xff0c;也是难点&#xff0c;痛点在于目前越来越多公司开始构建自己的BI报表平台但是没有合适的自动化测试…

SHA-512在Go中的实战应用: 性能优化和安全最佳实践

SHA-512在Go中的实战应用: 性能优化和安全最佳实践 简介深入理解SHA-512算法SHA-512的工作原理安全性分析SHA-512与SHA-256的比较结论 实际案例分析数据完整性验证用户密码存储数字签名总结 性能优化技巧1. 利用并发处理2. 避免不必要的内存分配3. 适当的数据块大小总结 与其他…

一、Docker/安装包部署ClickHouse

Docker/安装包部署ClickHouse 一、docker部署1.安装Docker2.拉取ClickHouse镜像2.1 选择拉取版本2.2 拉取镜像 3.启动ClickHouse3.1 确定好挂载目录3.2 测试环境3.3 生产环境3.1.1 获取配置文件3.1.2 配置文件中添加用户3.1.3 启动容器 4.使用DBeaver连接 二、安装包安装1.准备…

Netty应用——通过WebSocket编程实现服务器和客户端长连接(十八)

Http协议是无状态的&#xff0c;浏览器和服务器间的请求响应一次&#xff0c;下一次会重新创建连接要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束&#xff0c;实现长连接了&#xff0c; 服务器可以发送消息给浏览器客户端浏览器和服务器端会相互感知…