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

4 篇文章 0 订阅

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值