.net/vb.net/C#绘制正多边形

在现在这个时代,谁还会拿着直尺和圆规画多边形呢?

我相信有很多这样的文章,但是大多数代码太冗余了,不方便阅读。

我们知道,高斯当年使用尺规作图做出了正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

绘制:

扫描二维码关注公众号,回复: 14785778 查看本文章
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_56050945/article/details/129959782