您的位置:首页 > 编程语言 > C#

通过画五角星,回顾啦三角函数

2017-04-27 13:09 120 查看
最终程序代码(c#winform paint事件里):

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)),即是最终的程序了-^^-。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  五角星 算法 c# winform