通过画五角星,回顾啦三角函数
2017-04-27 13:09
120 查看
最终程序代码(c#winform paint事件里):
最终程序效果图:
五角星程序演化记:
浅析:
循环处代码作用是得到五角星10个端点坐标,作为FillPolygon和DrawPolygon函数的输入。
为得到五角星的十个端点坐标,首先可以分析得到,十个端点与五角星中心点的连线把一圈分成啦10份,每份占36度,这也是angle*36的由来,至于(150, 90)这是中心点的坐标。
这里运用数学及物理中三角函数知识可知,angel*36可以理解成角速度w,每次要旋转多少度,里面 i无论加多少,只是把三角函数图像左右移动而已,不影响图像的形状,至于80和30则是振幅,这里是因为五角星的五个端点离中心点的距离不一样。
那么第一个版本的五角星程序就出现了,假设有个笛卡尔坐标系,那么取画五角星的起点为x轴正向的点,坐标为(150+80*cos0,90+80*sin0).可以写出如下程序:
效果图:
【注】可以看出,这个五角星是相对于x轴对称,那么我们想得到正五角星,那么就得将其逆时针旋转90度或者将其顺时针旋转270度,这里考虑到程序画布坐标系y轴正向是竖直向下的,所以如果应该把起点坐标写成(150+80*cos(0+270*angle),90+80*sin(0+270*angle)),即是最终的程序了-^^-。
Graphics g = e.Graphics; Pen pen = new Pen(Color.Yellow, 3); Brush brush = new SolidBrush(Color.Red); Point[] star = new Point[10]; double angle = Math.PI / 180; for (int i = 0; i < 10; i += 2) { star[i].X = (int)(150 + 80 * Math.Cos(angle * 36 * i + angle * 270)); star[i].Y = (int)(90 + 80 * Math.Sin(angle * 36 * i + angle * 270)); star[i + 1].X = (int)(150 + 30 * Math.Cos(angle * 36 * i + angle * 36 + angle * 270)); star[i + 1].Y = (int)(90 + 30 * Math.Sin(angle * 36 * i + angle * 36 + angle * 270)); } g.FillPolygon(brush, star); g.DrawPolygon(pen, star);
最终程序效果图:
五角星程序演化记:
浅析:
循环处代码作用是得到五角星10个端点坐标,作为FillPolygon和DrawPolygon函数的输入。
为得到五角星的十个端点坐标,首先可以分析得到,十个端点与五角星中心点的连线把一圈分成啦10份,每份占36度,这也是angle*36的由来,至于(150, 90)这是中心点的坐标。
这里运用数学及物理中三角函数知识可知,angel*36可以理解成角速度w,每次要旋转多少度,里面 i无论加多少,只是把三角函数图像左右移动而已,不影响图像的形状,至于80和30则是振幅,这里是因为五角星的五个端点离中心点的距离不一样。
那么第一个版本的五角星程序就出现了,假设有个笛卡尔坐标系,那么取画五角星的起点为x轴正向的点,坐标为(150+80*cos0,90+80*sin0).可以写出如下程序:
for (int i = 0; i < 10; i += 2) { star[i].X = (int)(150 + 80 * Math.Cos(angle * 36 * i)); star[i].Y = (int)(90 + 80 * Math.Sin(angle * 36 * i)); star[i + 1].X = (int)(150 + 30 * Math.Cos(angle * 36 * i + angle * 36)); star[i + 1].Y = (int)(90 + 30 * Math.Sin(angle * 36 * i + angle * 36)); }
效果图:
【注】可以看出,这个五角星是相对于x轴对称,那么我们想得到正五角星,那么就得将其逆时针旋转90度或者将其顺时针旋转270度,这里考虑到程序画布坐标系y轴正向是竖直向下的,所以如果应该把起点坐标写成(150+80*cos(0+270*angle),90+80*sin(0+270*angle)),即是最终的程序了-^^-。
相关文章推荐
- 通过画五角星,回顾啦三角函数
- canvas 五角星之回顾【初中三角函数】
- SVG DOM通过path绘制五角星
- 通过思维导图带你回顾微信公开课和微信小程序数据
- Android系统回顾(八):网络通信(三)Android与.net服务器通过Socket通信
- 通过例子回顾C++基本知识(一)
- 通过一个小代码回顾C的打印输出格式
- 通过例子回顾C++基本知识(二)
- 数据库应用--回顾SQLite数据库--通过按钮来进行对数据库的管理以及登陆验证操作
- 通过回顾基础来加强你的编程技能
- 3月第4周回顾:微软OOXML被通过为国际标准 黑客大赛开幕
- 101与金根回顾敏捷个人:(97)通过实践TOGAF来思考如何学习并应用新的方法?
- Vue 通过自定义指令回顾v-内置指令(小结)
- 如何通过回顾保持学习状态
- 将陆续回顾javaSE基础知识--通过圣思园张龙老师的视频
- Cisco基础实验回顾1--通过Console口访问路由器
- 敏捷开发:如何通过回顾保持学习状态
- 早上发现小蜘蛛通过小网抓蚊子,感叹,十年软件开发,转行没行业经验,就像小蜘蛛一样会很艰难,回顾经历心酸什么滋味都有,没什么积蓄,肩负着一家人的生活,迷茫及无奈!
- Cisco基础实验回顾2--通过Telnet访问路由器
- 敏捷开发:如何通过回顾保持学习状态