在现在这个时代,谁还会拿着直尺和圆规画正多边形呢?
我相信有很多这样的文章,但是大多数代码太冗余了,不方便阅读。
我们知道,高斯当年使用尺规作图做出了正17边形,它的核心是计算边到圆心所构成的角的度数,即:中心角
中心角的公式:
于是乎,我们得到以下代码:
r = CInt(TextBox1.Text)
side = CInt(TextBox2.Text)
Dim n As Double = 2 * PI / side
求出中心角n,接下来我们需要定义一个x,y变量,然后初始化一个点的动态数组,如下:
Dim x, y As Double
Dim plist As New List(Of Point)
plist.Add(New Point(r, 0))
先添加一个点,即第一个点
然后我们根据三角函数sin 和 cos函数就可以计算得出,下一个角所对应的直角坐标系的坐标,由于我们是在窗体里面操作,所以y取相反数。我们默认是以中心点到刚刚添加的第一个点为始边
始边变了,三角函数公式也就变了,实质是90关系,里面存在一个诱导公式,在sin函数和cos函数里变换。循环计算出每一个点的坐标,角度依次累加(从1数到中心角乘以边数-1),例如正三角形只循环2次:
For i = 1 To side - 1
x = r * Sin(n * i)
y = -r * Cos(n * i)
plist.Add(New Point(r + x, r + y))
Next
绘制:
Dim bmp As New Bitmap(r * 2, r * 2)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawPolygon(New Pen(Color.Red, 1), plist.ToArray)
PictureBox1.Image = bmp
效果:
C#源代码:
{
r = System.Convert.ToInt32(TextBox1.Text);
side = System.Convert.ToInt32(TextBox2.Text);
double n = 2 * PI / (double)side;
double x, y;
List<Point> plist = new List<Point>();
plist.Add(new Point(r, 0));
for (var i = 1; i <= side - 1; i++)
{
x = r * Sin(n * i);
y = -r * Cos(n * i);
plist.Add(new Point(r + x, r + y));
}
Bitmap bmp = new Bitmap(r * 2, r * 2);
Graphics g = Graphics.FromImage(bmp);
g.DrawPolygon(new Pen(Color.Red, 1), plist.ToArray());
PictureBox1.Image = bmp;
}