news 2026/7/15 15:17:11

JavaScript 绘制简单不规则图形:三角形与五角星实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 绘制简单不规则图形:三角形与五角星实战教程

1. 前言

在 Web 开发中,使用 JavaScript 绘制图形是一项基础且实用的技能。无论是数据可视化、游戏开发还是 UI 设计,都离不开图形的绘制。本文将重点介绍如何使用原生 JavaScript 绘制两种常见的不规则图形:三角形五角星。我们将从最基础的 Canvas API 入手,逐步构建出完整的图形。

2. 准备工作:创建画布

在开始绘制之前,我们需要一个 HTML 画布(Canvas)元素作为绘图区域。

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>绘制不规则图形</title> <style> canvas { border: 1px solid #ccc; display: block; margin: 20px auto; } </style> </head> <body> <canvas id="myCanvas" width="400" height="300"></canvas> <script src="script.js"></script> </body> </html>

同时,创建一个script.js文件,并获取 Canvas 的 2D 绘图上下文。

// script.js const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d');

3. 绘制三角形

三角形是最简单的多边形。在 Canvas 中,我们通过定义三个顶点并连接它们来绘制。

3.1 基本三角形绘制

使用beginPath()moveTo()lineTo()closePath()方法。

function drawTriangle(x1, y1, x2, y2, x3, y3, fillColor = '#3498db') { ctx.beginPath(); ctx.moveTo(x1, y1); // 起点 ctx.lineTo(x2, y2); // 第二个点 ctx.lineTo(x3, y3); // 第三个点 ctx.closePath(); // 自动连接回起点 ctx.fillStyle = fillColor; ctx.fill(); // 填充三角形 // 可选:绘制边框 ctx.strokeStyle = '#2c3e50'; ctx.lineWidth = 2; ctx.stroke(); } // 绘制一个三角形 drawTriangle(100, 50, 50, 150, 150, 150);

这段代码会在画布上绘制一个蓝色的填充三角形。

3.2 绘制等边三角形

等边三角形的三个顶点坐标可以通过数学公式计算得出。

function drawEquilateralTriangle(centerX, centerY, sideLength, fillColor = '#e74c3c') { const height = sideLength * Math.sqrt(3) / 2; // 等边三角形的高 const x1 = centerX; const y1 = centerY - height / 2; // 顶点 const x2 = centerX - sideLength / 2; const y2 = centerY + height / 2; // 左下角点 const x3 = centerX + sideLength / 2; const y3 = centerY + height / 2; // 右下角点 drawTriangle(x1, y1, x2, y2, x3, y3, fillColor); } // 在画布中心绘制一个边长为100的等边三角形 drawEquilateralTriangle(200, 150, 100);

4. 绘制五角星

五角星的绘制比三角形复杂,需要计算十个顶点(五个外顶点和五个内顶点)。

4.1 计算五角星顶点

五角星的顶点坐标可以通过圆上的角度和半径来计算。

function drawStar(centerX, centerY, outerRadius, innerRadius, fillColor = '#f1c40f') { ctx.beginPath(); for (let i = 0; i < 10; i++) { const radius = i % 2 === 0 ? outerRadius : innerRadius; // 交替使用外半径和内半径 const angle = Math.PI / 2 + i * Math.PI / 5; // 每个顶点间隔36度(π/5弧度) const x = centerX + radius * Math.cos(angle); const y = centerY - radius * Math.sin(angle); // Canvas Y轴向下为正,故用减号 if (i === 0) { ctx.moveTo(x, y); } else { ctx.lineTo(x, y); } } ctx.closePath(); ctx.fillStyle = fillColor; ctx.fill(); ctx.strokeStyle = '#d35400'; ctx.lineWidth = 2; ctx.stroke(); } // 在画布中心绘制一个五角星 drawStar(200, 150, 80, 40);

outerRadius是外顶点到中心的距离,innerRadius是内顶点到中心的距离。调整这两个值可以改变五角星的“胖瘦”。

4.2 绘制多个不同样式的星星

我们可以封装一个更通用的函数,并绘制多个星星。

function drawStyledStar(centerX, centerY, outerRadius, innerRadius, fillColor, rotation = 0) { ctx.save(); // 保存当前绘图状态 ctx.translate(centerX, centerY); // 将原点移动到星星中心 ctx.rotate(rotation * Math.PI / 180); // 旋转(角度转弧度) ctx.beginPath(); for (let i = 0; i < 10; i++) { const radius = i % 2 === 0 ? outerRadius : innerRadius; const angle = Math.PI / 2 + i * Math.PI / 5; const x = radius * Math.cos(angle); const y = -radius * Math.sin(angle); // 注意Y轴方向 if (i === 0) { ctx.moveTo(x, y); } else { ctx.lineTo(x, y); } } ctx.closePath(); ctx.fillStyle = fillColor; ctx.fill(); ctx.strokeStyle = '#2c3e50'; ctx.lineWidth = 1; ctx.stroke(); ctx.restore(); // 恢复绘图状态 } // 绘制多个星星 drawStyledStar(100, 80, 30, 12, '#9b59b6', 0); drawStyledStar(300, 80, 40, 18, '#1abc9c', 15); drawStyledStar(100, 220, 35, 14, '#e67e22', -10); drawStyledStar(300, 220, 25, 10, '#e74c3c', 30);

5. 完整示例与交互

将以上代码整合,并添加简单的交互(例如点击画布随机绘制三角形或星星)。

// 整合后的 script.js 文件 const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // ... 此处插入前面定义的 drawTriangle, drawEquilateralTriangle, drawStar, drawStyledStar 函数 ... // 初始绘制 drawEquilateralTriangle(200, 150, 100, '#3498db'); drawStar(200, 150, 80, 40, '#f1c40f'); // 点击交互:随机绘制图形 canvas.addEventListener('click', function(event) { const rect = canvas.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布 // 随机选择绘制三角形或星星 if (Math.random() > 0.5) { const size = 20 + Math.random() * 50; drawEquilateralTriangle(x, y, size, `hsl(${Math.random() * 360}, 70%, 60%)`); } else { const outerR = 15 + Math.random() * 40; const innerR = outerR * 0.5; drawStyledStar(x, y, outerR, innerR, `hsl(${Math.random() * 360}, 70%, 60%)`, Math.random() * 360); } });

6. 总结

通过本文,我们学习了使用 JavaScript 和 Canvas API 绘制两种不规则图形的方法:

  • 三角形:通过连接三个顶点实现,可以轻松绘制任意三角形或等边三角形。
  • 五角星:通过计算外顶点和内顶点的坐标,并按顺序连接而成。

核心步骤可以归纳为:获取上下文 → 计算路径点 → 开始路径 → 移动/连线 → 闭合路径 → 设置样式 → 填充/描边。掌握这些基础后,你可以举一反三,绘制出更复杂的多边形和自定义图形。

你可以尝试修改代码中的坐标、颜色、大小和旋转角度,创造出丰富多彩的图形效果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 15:16:30

基于微信小程序的大学生求职系统的设计与开发

摘 要 网上办公可以实现远程处理事务&#xff0c;远程提交工作和随时追踪工作的状态。网上办公系统给人们带来前所未有的体验&#xff0c;满足了新时代人们的办公需求&#xff0c;所以网上办公系统模式得到大力发展。 本系统为微信大学生求职系统&#xff0c;是采用微信和网络…

作者头像 李华
网站建设 2026/7/15 15:16:06

基于Flask的金融信贷风险分析与预测

摘 要 随着金融行业的快速发展&#xff0c;信贷业务作为其中的重要组成部分&#xff0c;面临着日益复杂和多变的风险挑战。传统的风险分析方法往往受限于数据处理能力和计算效率&#xff0c;难以满足现代金融信贷业务对风险分析与预测的准确性和实时性要求。为了有效应对这些挑…

作者头像 李华
网站建设 2026/7/15 15:13:21

勒索软件:藏在网络里的致命杀手,企业中招直接瘫痪

什么是勒索软件&#xff1f; 勒索软件首先是一种特殊的恶意软件。勒索软件的特殊之处在于&#xff0c;它采用技术手段限制受害者访问系统或系统内的数据&#xff08;如文档、邮件、数据库、源代码等&#xff09;&#xff0c;并以此要挟受害者。受害者需要支付一定数量的赎金&a…

作者头像 李华
网站建设 2026/7/15 15:13:10

Load81高级技巧:如何扩展自定义功能与游戏开发实战

Load81高级技巧&#xff1a;如何扩展自定义功能与游戏开发实战 【免费下载链接】load81 SDL based Lua programming environment for kids similar to Codea 项目地址: https://gitcode.com/gh_mirrors/lo/load81 Load81是一款基于SDL的Lua编程环境&#xff0c;专为儿童…

作者头像 李华