Canvas绘制任意正多边形
Canvas任意正多边形绘制
- 几何知识介绍
- 任意正多边形规律
- 坐标表达方式
- 绘图方式
- 代码
- 代码一(没有摆正)
- 代码二(摆正了解决了强迫症的问题)
几何知识介绍
任意正多边形规律
1、任意正多边形都存在与一个外接圆。
2、外接圆的圆心为正多边形的中心、重心(到各边的距离相等,到各角的距离相等=外接圆半径)
3、中心到各个角的连线将正多边形n等分(n = 正多边形边数),同时将圆心角(2π)n等分。
我们已正八边形为例,如下图所示:
坐标表达方式
1、坐标系上任意一点到圆心的连线,我们可以用 θ 来表示。
2、上述连线上的任意点的坐标可以表示为(r * cosθ,r * sinθ),其中r是该点到(0,0)的距离,θ是直线与x坐标轴的夹角(0 <= θ <= 2π)
绘图方式
假设我们要绘制一个正n边形,他的外接圆半径为r,圆心角被平分为θ(θ = 2π/n)。
那么正多边形所有的顶点坐标分别是:
(r * cos(θ * 0),r * sin(θ * 0))
(r * cos(θ * 1),r * sin(θ * 1))
(r * cos(θ * 2),r * sin(θ * 2))
…
(r * cos(θ * n),r * sin(θ * n))
我们只需要将这些点连起来就可以获得一个正多边形
代码
代码一(没有摆正)
<!DOCTYPE html>
<html><body><!--定义画布容器,给个边框省的你们找不到--><canvas id="myCanvas" width="400" height="400" style="border:1px solid #d3d3d3;">Your browser does not support the HTML5 canvas tag.</canvas><script>//获取画布对象var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");var canvasSide = 400,circleCenterX = canvasSide/2,circleCenterY = canvasSide/2;var sideLength = 200,sideCount = 6,r = sideLength/(2*Math.sin(Math.PI/4));var a = 2 * Math.PI / sideCount ; // 角度ctx.beginPath();for( var i = 0; i <= sideCount; i++ ){var x = circleCenterX + r * Math.cos(a * i); var y = circleCenterY + r * Math.sin(a * i);if (i == 0){ctx.moveTo(x,y); // 移动到第一个顶点 }else{ctx.lineTo(x,y); // }}ctx.closePath();ctx.stroke();</script></body></html>
画完之后发现一个问题,正多边形它摆放位置不正,研究一番发现如果这样写第一个点一定是落在x轴上(y = r*sin0° = 0)的,于是进行改造让首次的点摆正它更新后代码如下:
代码二(摆正了解决了强迫症的问题)
<!DOCTYPE html>
<html><body><!--定义画布容器,给个边框省的你们找不到--><canvas id="myCanvas" width="400" height="400" style="border:1px solid #d3d3d3;">Your browser does not support the HTML5 canvas tag.</canvas><script>//获取画布对象var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");var canvasSide = 400,circleCenterX = canvasSide/2,circleCenterY = canvasSide/2;var sideLength = 200,sideCount = 6,r = sideLength/(2*Math.sin(Math.PI/4));var a = 2 * Math.PI / sideCount ; // 角度var offset = - Math.PI/2;if(sideCount % 2 ==0){offset = - Math.PI/2 + a/2;}ctx.beginPath();for( var i = 0; i <= sideCount; i++ ){var x = circleCenterX + r * Math.cos(a * i + offset); var y = circleCenterY + r * Math.sin(a * i + offset);if (i == 0){ctx.moveTo(x,y); // 移动到第一个顶点 }else{ctx.lineTo(x,y); // }}ctx.closePath();ctx.stroke();</script></body></html>
Canvas绘制任意正多边形相关推荐
- 利用Canvas绘制雷达图
雷达图(蜘蛛网图)是一种常见的数据分析图表,本文采用canvas来绘制雷达图,并最终封装成一个小组件.首先来看一下最终的效果图: 如何画正多边形 以正五边形雷达图为例(其他任意正多边形也一样),如下图 ...
- canvas绘制图像image
canvas绘制图像image 1.image的三个script的基本语法 准备工作:1.定义画布长度,获取2D绘图环境 2.建立对面对象,设置图片路径 3.载入图片,开始绘制 a.简单的画布 ...
- Canvas学习:封装Canvas绘制基本图形API
Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...
- html5的canvas绘制时钟
为什么80%的码农都做不了架构师?>>> 最近一直在学习html5,学到了html5的canvas标签,这个画布真的是很强大,它有对应的javascript的api的支持,你可 ...
- html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
html5: Canvas 绘制基本图形 从绘制直线 到 路径 Jack Lee 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.n ...
- 小程序 uni canvas绘制圆角图片 圆角矩形
小程序 uni canvas绘制圆角图片 圆角矩形 获取canvas的宽度保证适应屏幕 uni.getSystemInfo({success: (res)=> { // res - 各种参数le ...
- html5 直线的两头弯曲,html5教程 (二)(canvas绘制简单的直线)
Html5_convas var elem = document.getElementById("myConvas"); if (elem && elem.getC ...
- canvas绘制折线路径动画
最近有读者加我微信咨询这个问题: 其中的效果是一个折线路径动画效果,如下图所示: 要实现以上路径动画,一般可以使用svg的动画功能.或者使用canvas绘制,结合路径数学计算来实现. 如果用canva ...
- 用html制作阴影效果,使用HTML5 Canvas绘制阴影效果的方法
这篇文章主要介绍了使用HTML5 Canvas绘制阴影效果的方法,包括一个3D拉影 边缘模糊效果文字的编写例子,在阴影效果的利用上进一步深入,需要的朋友可以参考下 创建阴影效果需要操作以下4个属性: ...
最新文章
- 推荐8个超实用的神级工具,值得收藏起来!
- 程序员离职删代码被判10个月,京东到家说恢复数据库花了3万,网友:这是真有仇啊...
- 11.23月福首页30%
- RHCS配置web高可用集群
- Android使用READ_CONTACTS读取手机联系人
- python开发的一些tips
- 斗地主AI算法——第十六章の样例分析
- 20100823工作记录
- [Vue] Vue后台模板汇总
- Visual Basic
- Unityt涂抹擦除功能
- pythonbmi代码_用python写一个BMI体制指数测试
- swoole 2.x使用php什么版本,Think-Swoole 教程(二)安装
- 羲和能源大数据 | 全新功能板块正式上线
- |app自动化测试之Appium问题分析及定位
- 让程序员“#*...%#{4*”的瞬间:你是修电脑的吧?
- 大闹天竺里的机器人_王宝强的电影《大闹天竺》都植入了哪些品牌?
- pypinyin |将得到的中文转化成拼音形式的字符串(详细过程+代码)
- 使用IDEA远程debug调试(一篇懂所有)
- oracle的clob赋值_Oracle中Clob类型处理解析 (转)
热门文章
- H.266 JEM7.0 帧内预测之四(Planar模式的基于位置的帧内预测组合 (PDPC))
- ENVI辐射定标与大气校正
- Landsat影像的辐射定标和大气校正
- 旺旺消息上传到服务器,旺旺在线却发送不了消息怎么办
- 印度狂妄,华为和中兴在印度5G设备市场面临不确定性,三星却已占领市场
- 云客Drupal源码分析之合并数组
- 【APP设计规范指南—工信部启示】
- BN和IN对比及其他Normalization
- Ceph报错( ceph config set mon auth_allow_insecure_global_id_reclaim false)问题处理
- Xilinx IP核AXI Memory Mapped to PCI Express使用