最近做Box2dWeb开发时,想写个创建正多边形的功能,可是由于学识尚浅,我在草稿纸上画了,想了一个上午也没有研究出什么好方法。后来翻抽屉的时候,找出了以前哥哥画的一张用同心圆画椭圆的示意图。看到这幅画,我不禁在想椭圆不就是一个N边形吗?圆不就是一个正N边形吗?如果把两个同心圆的半径设定为相等,画出来的椭圆不就是一个圆吗?因此,我立刻开始实验。原本我以为比较难,会用到圆的解析式之类的,没想到就45行代码就搞定了,主要用到的数学知识就是sin和cos。

也许有人不明白如何用同心圆画椭圆,我就借用网上找的一张图片给大家展示吧

这个画法很经典,做法简要概括一下就是:

画一个同心圆,然后以圆心为原点画一个二维坐标系;接着用N条过圆心的直线将圆等分,图中所示就是4条,把圆等分为了12份。每条直线都会与两个圆有交点,这时候我们就可以确定椭圆上的一个点——设直线与小圆的交点为(a, b),与大圆的交点为(c, d),确定的那个点的坐标则为(c, b);我们有N条直线就会得出2 * N + 4这样的点。可以看出,得到的点的坐标通式为:(与大圆的交点的x坐标, 与小圆的交点的y坐标)。要得到这些坐标,我们只用知道直线的条数N和大圆小圆的半径(或直径),然后用sin和cos进行计算即可。得到这些点后,把这些点连接起来就大致是个椭圆了;如果你把N的数目设定的越大,那么画出来的图形就更接近于椭圆。

与画椭圆不同的是,画正多边形不需要这么复杂,只需要一个圆就够了。而且也不要什么坐标系了,你要N 边形就画N条过圆心的直线,然后这些直线与圆的交点就是多变形的顶点。把顶点连接起来就是多变形。

现在,我们可以上代码了:

html>

Make Regular Polygon

window.onload = function () {

var canvasTag = document.getElementById("mycanvas");

var c = canvasTag.getContext("2d");

var vertices = getPolygonVertices(7, 100);

c.beginPath();

c.fillStyle = "lightgray";

c.fillRect(0, 0, canvasTag.width, canvasTag.height);

c.translate(canvasTag.width / 2, canvasTag.height / 2);

c.moveTo(vertices[0][0], vertices[0][1]);

for (var i = 1; i

c.lineTo(vertices[i][0], vertices[i][1]);

}

c.lineWidth = 5;

c.closePath();

c.stroke();

};

function getPolygonVertices (edges, r) {

var ca = 0, aiv = 360 / edges, ata = Math.PI / 180, list = new Array();

for (var k = 0; k

var x = Math.cos(ca * ata) * r,

y = Math.sin(ca * ata) * r;

list.push([x, y]);

ca += aiv;

}

return list;

}

包括canvas渲染和html tag部分,一共45行。真正意义上的算法部分就只在getPolygonVertices函数里。 这个getPolygonVertices有两个参数,第一个参数是edges边数,第二个参数是圆的半径,决定多变形的大小。

算法在前面已经讲解过了,很简单很基础吧~

多边形画椭圆算法java_运用椭圆画法,45行代码画出任意正多边形相关推荐

  1. 多边形画椭圆算法java_运用椭圆画法,45行代码画出随意正多边形

    近期做Box2dWeb开发时,想写个创建正多边形的功能.但是因为学识尚浅.我在草稿纸上画了,想了一个上午也没有研究出什么好方法.后来翻抽屉的时候,找出了曾经哥哥画的一张用同心圆画椭圆的示意图. 看到这 ...

  2. python画自己的名字_Python+OpenCV 十几行代码模仿世界名画

    原标题:Python+OpenCV 十几行代码模仿世界名画 现在很多人都喜欢拍照(自拍).有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma.versa 等, ...

  3. python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(一)...

    为什么要说分词呢?其实这个话题挺大的.所以准备分几篇来写,这次先写第一篇. 写给别人看,也写给自己.毕竟,自己在思特奇也做了好久了,写点有意思的东西,结交一些有兴趣的朋友. 一是确实最近的一些实践给了 ...

  4. Python编程学习第一篇——Python零基础快速入门(三)——10行代码画朵花

    上一节讲了一些Python编程的一些基础知识,从这节开始,我们将跟随一些实际的小程序示例,进入正式的编程学习.       下面我们就来介绍一下今天这个只有10行代码的小程序,先来看一下它的运行效果, ...

  5. 用python画小猪佩奇的编码_如何用Python代码画小猪佩奇

    Python语言的功能太强大了,可以制作出很多想想的作品来,不信吗?用Python代码还可以画出小猪佩奇,代码其实很简单的,下面,就将几个关键步骤代码分享出来. 怎么用Python代码画小猪佩奇? 首 ...

  6. python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(二)...

    从大学毕业到工作的开始几年,一直觉得大学期间学的线性代数,离散数学,概率论简直是浪费时间. 那时候实际做的代码,大部分都是数据进销存.数据输入到数据库介质中的转换,CS,BS架构都写过一些.总觉得现实 ...

  7. 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路

    前段时间学会了打麻将,觉得老祖宗的智慧真的博大精深,很好玩,食胡的时候真兴奋啊,于是空余时间就想自己写个麻将游戏出来,模仿欢乐麻将那种,数学差,想了两个礼拜才想出一个胡牌算法,前段时间学会了打麻将. ...

  8. 新手也能立即上手,用Python90多行代码画出“樱花园”仙境(源码+注释)

    还记得在大学时,靠近西边有一片特别大的樱花园,每到3-4月,樱花开了,美的啊!那片区域特别多学妹与学姐来拍照,男生个个面如带花,实际心如一头狼,就想偶遇个小学妹,不怕嘲笑,我也去蹲点过,还幸运的与校园 ...

  9. 生信小白7行代码画一个高颜值的世界地图

    不要害怕编程,它其实像泡方便面一样简单.先在百度搜索R,然后像安装QQ一样,一直选择下一步,安装成功后,双击打开桌面R的快捷方式. 复制粘贴下面代码,敲一个回车键,就能得到下面的世界地图.如果这个图上 ...

最新文章

  1. 第一百九十四节,jQuery EasyUI,Droppable(放置)组件
  2. 嵌入式笔录(6)单管收音机电路分析
  3. iOS隐藏键盘的几种方式
  4. php target标签,为Typecho文章页url标签添加nofollow和target属性
  5. Excel将多个工作簿加载到SQL Server中
  6. ubuntu18.04 ros 使用anaconda创建虚拟环境 python3.7安装 opencv-3.4.6,TensorFlow安装,notebook
  7. python中的map对象_python map对象
  8. 鸡蛋掉落----经典dp(动态规划)
  9. 教你设置让电脑每天在指定时间自动关机
  10. 1~20以内的加减法
  11. ogg在DDL语句同步时出现[Error code [942], ORA-00942的分析
  12. codeforces 416E President's Path floyd+D(递)P(推)
  13. HI3520DV200+GV7601采集1080P视频
  14. 常见压缩格式(未完待续)
  15. 腾讯开放世界游戏《王者荣耀·世界》获登记批准,对标《原神》
  16. 数据挖掘导论学习笔记:第三章 探索数据
  17. 尤登弘—中小企业最佳赢利管理模式
  18. Python 基础教程(第二版)读书笔记
  19. 面试技巧(4)面试技巧和注意事项
  20. 农村电子商务专家学者以及来自全国各地的淘宝村代表将齐聚一堂

热门文章

  1. BUUCTF·[WUSTCTF2020]大数计算·WP
  2. Java各种视频教学(转)
  3. 万字长文:五年数据洞察中国餐饮大趋势
  4. 【苹果CMS技术教程】苹果CMSV10宝塔全自动定时采集教程
  5. Python中四舍五入的讲解
  6. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
  7. el-table高亮显示
  8. MySQL | 全内容
  9. android 无法添加帐户,安卓手机outlook无法登录、添加帐户
  10. 【xlwings api语言参考】Range.FormulaR1C1 属性