正多边形是一种很有意思的图形,但是如果想要绘制一个正多边形并不是那么容易的。最近看书介绍了这一块的内容,但是它只是很简单的描述了一下,并没有详细的过程。所以自己推导了一下,在这里记录一下。这种推导方式是通用的,在其它任何的绘图库中都是可以使用的。在这里我使用canvas来实现绘制。

坐标推导

绘制正多边形的关键点在于需要计算出多边形顶点的位置,这里需要利用到一些三角函数的简单知识。我这里以正八边形为例子进行举例。正多边形的顶点都在其外接圆上,所以
正多边形上任意一个顶点的坐标为:
x = r * cos(θ)
y = r * sin(θ)
这里只是简单的初中三角函数的知识。

canvas 绘制

我们在计算机上进行绘图,它的坐标系是下图所示的。在上一个图中,它是默认坐标原点作为圆心的,不具有一般性。所以我们需要将它转化为下面这样的形式,这张图片是我用canvas绘制的,有点简陋,大家凑合着看吧。
这里介绍一下已知条件:
圆心 (X, Y)
半径 R
角度 θ

所以 点0 的坐标为:
x0 = X + R * cos(θ)
y0 = Y - R * sin(θ)

其它点的坐标也可以由上式进行推导,区别在于 角度θ 值不同,且因为是正多边形,角度是倍数关系。角度θ = 360/边数

通过前面的推导,我们只需要知道一个需要绘制的正多边形外接圆圆心的位置和外接圆的半径,就可以绘制任意一个正多边形了。下面我们就来尝试使用 canvas 进行绘制!
这里我们尝试来绘制一个正八边形:
圆心位置为:(250, 250)
半径为:100

let canvas = document.getElementById("canvas"),context = canvas.getContext("2d");let centerX = 250,   // 外接圆圆心 x 坐标cneterY = 250,   // 外接圆圆心 y 坐标r = 100,         // 外接圆半径sides = 8,       // 外接圆边数points = [];     // 存储外接圆各个顶点的数组
let angle = 0;  // 多边形的角度,弧度制
for (let i = 0; i < sides; i++) {x = centerX + r * Math.sin(angle);y = cneterY - r * Math.cos(angle);angle += 2*Math.PI/sides;points.push({x:x, y:y});
}
console.log(points);
context.beginPath();context.moveTo(points[0].x, points[0].y);for (let i = 1; i < sides; i++) {context.lineTo(points[i].x, points[i].y);
}
context.closePath();
context.stroke();

这里我在绘制图上增加了数字,数字表示绘制的先后顺序,但是在实际代码中将其删除了。
所以绘制一个正多边形的步骤是:
通过圆心、半径及角度计算出各个顶点的位置,然后一次连线各个顶点即可。从初始点连接到初始点或者连接到最后一条,然后调用 closePath() 方法,这里是采用这种方式。

封装

将绘制正多边形的步骤封装成一个函数,这里会绘制几个例子。

/*x 外接圆圆心 x坐标y 外接圆圆心 y坐标r 外接圆半径
*/
function drawPolygon(centerX, centerY, radius, sides) {let angle = 0;let points = []// 求各个顶点的坐标for (let i = 0; i < sides; i++) {x = centerX + radius * Math.sin(angle);y = centerY - radius * Math.cos(angle);angle += 2*Math.PI/sides;points.push({x: x, y: y});}console.log(points);// 顶点坐标连线,先移动到第一个顶点context.moveTo(points[0].x, points[0].y);// 依次开始连线for (let i = 1; i < sides; i++) {context.lineTo(points[i].x, points[i].y);}// 关闭路径,使得最后一点和第一点闭合context.closePath();context.stroke();
}

依次绘制三角形、四边形到十边形。

drawPolygon(100, 150, 100, 3);
drawPolygon(300, 150, 100, 4);
drawPolygon(500, 150, 100, 5);
drawPolygon(700, 150, 100, 6);
drawPolygon(100, 400, 100, 7);
drawPolygon(300, 400, 100, 8);
drawPolygon(500, 400, 100, 9);
drawPolygon(700, 400, 100, 10);

旋转

这样绘制的多边形都是在垂直方向上对称的(这个从上面的推导中得出),我们需要的是任意的多边形,这里还不够任意,多边形应该可以在此基础上进行旋转才行。所以,需要给绘制多边形的函数多增加一个起始角度参数。

/*x 外接圆圆心 x坐标y 外接圆圆心 y坐标r 外接圆半径startAngle 起始旋转角度
*/
function drawPolygon(centerX, centerY, radius, sides, startAngle) {let angle = startAngle || 0;let points = []// 求各个顶点的坐标for (let i = 0; i < sides; i++) {x = centerX + radius * Math.sin(angle);y = centerY - radius * Math.cos(angle);angle += 2*Math.PI/sides;points.push({x: x, y: y});}console.log(points);// 顶点坐标连线,先移动到第一个顶点context.moveTo(points[0].x, points[0].y);// 依次开始连线for (let i = 1; i < sides; i++) {context.lineTo(points[i].x, points[i].y);}// 关闭路径,使得最后一点和第一点闭合context.closePath();context.stroke();
}

这里将正四边形、正六边形、正八边形和正十边形进行旋转,让他们最上面的边是水平放置的。

drawPolygon(100, 150, 100, 3);
drawPolygon(300, 150, 100, 4, 45/180*Math.PI);
drawPolygon(500, 150, 100, 5);
drawPolygon(700, 150, 100, 6, 30/180*Math.PI);
drawPolygon(100, 400, 100, 7);
drawPolygon(300, 400, 100, 8, 22.5/180*Math.PI);
drawPolygon(500, 400, 100, 9);
drawPolygon(700, 400, 100, 10, 18/180*Math.PI);

结语

好了,看到了这里的时候,想必你已经对如何推导及绘制正多边形有所了解了。一定要尝试自己去经历推导和绘制的过程,那是非常有趣的事情。已经有很多人写了类似的内容,我也参考了其它人写的,但是总是感觉有一些迷惑的地方。索性自己来亲自推导,绘制一遍,并记录这个过程,现在这一块的内容我已经比较了解了。纸上得来终觉浅,绝知此事要躬行。

正多边形的数学推导及绘制相关推荐

  1. 数学推导+纯Python实现机器学习算法:逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 自本系列第一讲推出以来,得到了不少同学的反响和赞成,也有同学留言说最好能把数学推导部分写的详细点,笔者只能说尽力,因为打公式实 ...

  2. 机器学习——线性回归数学推导

    文章目录 线性回归数学推导 基础知识 线性回归的计算 利用矩阵知识对线性公式进行整合 误差项的分析 似然函数的理解 矩阵求偏导 线性回归的最终求解 实验 1 二维直线实验 2 三维平面实验 3 利用最 ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法21:马尔可夫链蒙特卡洛...

    Python机器学习算法实现 Author:louwill Machine Learning Lab 蒙特卡洛(Monte Carlo,MC)方法作为一种统计模拟和近似计算方法,是一种通过对概率模型随 ...

  4. 【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维

    Python机器学习算法实现 Author:louwill Machine Learning Lab 作为一种常见的多元统计分析方法,主成分分析法(Principal Component Analys ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法17:XGBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从陈天奇于2015年提出XGBoost以来,该模型就一直在各大数据竞赛中当作大杀器被频繁祭出.速 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法7:神经网络

    Python机器学习算法实现 Author:louwill 上一节中笔者和大家了解了感知机的基本原理及其Python实现.本节笔者将在感知机的基础上继续介绍神经网络模型.从上一讲我们知道,感知机是一种 ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法6:感知机

    Python机器学习算法实现 Author:louwill 今天笔者要实现的机器学习算法是感知机(perceptron).感知机是一种较为简单的二分类模型,但由简至繁,感知机却是神经网络和支持向量机的 ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法2:逻辑回归

    自本系列第一讲推出以来,得到了不少同学的反响和赞成,也有同学留言说最好能把数学推导部分写的详细点,笔者只能说尽力,因为打公式实在是太浪费时间了..本节要和大家一起学习的是逻辑(logistic)回归模 ...

  9. pca数学推导_PCA背后的统计和数学概念

    pca数学推导 As I promised in the previous article, Principal Component Analysis (PCA) with Scikit-learn, ...

最新文章

  1. matlab径向分布函数作图_分子动力学的径向分布函数绘制
  2. Redis 的持久化方案
  3. modelsim仿真中遇到的问题
  4. 树莓派kail linux安装wine,在ubuntu14.04中安装wine
  5. const in c and cpp
  6. 使用nodejs和art-template模板引擎实现apache的部分功能
  7. 命中注定码农路[一. 重新开始]
  8. 使用新操作码在比特币现金上进行首次原子竞猜
  9. SQL Server一些重要视图 1
  10. 怎样呵护友谊_呵护友谊需要学会尊重对方.PPT
  11. 如何短期通过2022年3月PMP考试?
  12. iOS —— 极光推送和极光IM
  13. MATLAB中clf函数
  14. Excel公式-TEXT函数使用
  15. 【Leetcode】1774. Closest Dessert Cost
  16. intrins.h 简介
  17. skid buffer
  18. ​治理 V20 领导应如何支持
  19. 专转本就业歧视怎么消除_人工智能可以帮助消除歧视
  20. pull时解决conflicts

热门文章

  1. 【信息技术】【2005】基于互信息的数字化重建射线照片与电子束图像配准
  2. MAR在计算机组成原理上是啥,《计算机组成原理》(答案已补全).doc
  3. 宋体和英文字号与matlab中对照,Word中英文字号对照
  4. 如何轻松发表SCI论文?这几个方法帮你节约大把时间!
  5. 书城管理系统(Java web)
  6. UE4人物移动时的摄像机抖动
  7. 一个30岁的人给你提个醒:不管收入多少,你一定要养成存钱习惯
  8. Nginx 上传大文件超大超时解决办法
  9. Jupyter 运行py文件 踩过的坑和方法
  10. 亚马逊全球开店戴竫斐:2021中国出口跨境电商的蜕变与破局