当前位置: 首页 > backend >正文

【第2章 绘制】2.11多边形的绘制

文章目录

  • 前言
  • 简单多边形的绘制


前言

现在,我们已经实现全部的基本图形,包括线段、矩形、圆弧、圆形、贝塞尔曲线等等。但是我们肯定要在canvas中绘制除此之外的其他图形,比如三角形、六边形、八边形等等。在本节中,你将绘学到如何绘制多边形。

使用 moveTo() 与 lineTo() 方法,再结合一些简单的三角函数,就能绘制任意边数的多边形。下面演示了如何根据多边形外接圆的圆心及半径,来计算某个多边形的顶点。

在这里插入图片描述


简单多边形的绘制

通过外接圆找到每个顶点的位置,然后根据点的位置依次画出各边即可。
在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>2-25-多边形的绘制</title></head><body><canvas id="canvas"></canvas><p>试试选择不同的边数</p><label for="sidesSelects">多边形边数</label><select id="sidesSelects"><option selected value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option></select></body><script>'use strict'let canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),sidesSelect = document.getElementById('sidesSelects'),Point = function (x, y) {this.x = xthis.y = y}//Function……/*** 获得多边形的所有外接圆顶点* @param centerX* @param centerY* @param radius* @param sides* @param startAngle*/function getPolygonPoints(centerX, centerY, radius, sides, startAngle) {let points = [],//这里的angle是基于钟表0点的位置开始计算,0点位置为0度,3点位置为π/2度angle = startAngle || 0for (let i = 0; i < sides; ++i) {points.push(new Point(centerX + radius * Math.sin(angle), centerY - radius * Math.cos(angle)))angle += (2 * Math.PI) / sides}return points}/*** 根据每个顶点的位置,创建多边形的路径* @param centerX* @param centerY* @param radius* @param sides* @param startAngle*/function createPolygonPath(centerX, centerY, radius, sides, startAngle) {let points = getPolygonPoints(centerX, centerY, radius, sides, startAngle)context.beginPath()context.moveTo(points[0].x, points[0].y)for (let i = 0; i < sides; ++i) {context.lineTo(points[i].x, points[i].y)}context.closePath()}/*** 绘制多边形*/function drawRubberbandShape() {createPolygonPath(canvas.width / 2, canvas.height / 2, canvas.width / 4, parseInt(sidesSelect.value), 0)context.stroke()}drawRubberbandShape()//eventsidesSelect.onchange = function () {context.clearRect(0, 0, canvas.width, canvas.height)drawRubberbandShape()}</script>
</html>

http://www.xdnf.cn/news/9674.html

相关文章:

  • 2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路
  • 苹果企业签名有什么限制
  • 去除ai写作痕迹的软件有哪些
  • C++异常处理机制
  • Abp Vnext Pro Vben5
  • php浮点数运算出错问题
  • 【白雪讲堂】多模态技术:统一认知的优化器
  • Spring测试框架全面解析
  • Java线程池管理最佳实践(设计模式)
  • 【JavaSE】异常处理学习笔记
  • 对比RFX2401C:AT2401C功率放大器的性价比与PIN兼容方案
  • 智汇云舟携最新无人机2D地图快速重建技术亮相广西国际矿业展览会
  • 蛋白质研究用蛋白酶购买渠道推荐
  • 深入理解C# Socket编程中的BeginConnect异步连接方法
  • vscode中launch.json、tasks.json的作用及实例
  • 苹果iOS应用ipa文件进行签名后无法连接网络,我们该怎么解决
  • 单链表反序实现
  • AI笔记 - 模型调试 - 调试方式
  • 日常踩坑-pom文件里jdbc配置问题
  • buunctf Crypto-[WUSTCTF2020]情书1
  • 模具制造业数字化转型:精密模塑,以数字之力铸就制造基石
  • 5月28日星期三今日早报简报微语报早读
  • AI任务相关解决方案1-基于NLP的3种模型实现实体识别,以及对比分析(包括基于规则的方法、CRF模型和BERT微调模型)
  • SQL进阶之旅 Day 6:数据更新最佳实践
  • STP协议:如何消除网络环路风暴
  • 【分治】翻转对
  • jsrpc进阶模式 秒杀js前端逆向问题 burp联动进行爆破
  • 【JavaEE】Spring事务
  • c++设计模式-介绍
  • 摩尔条纹 原理以及matlab 实现