利用GDI+绘制任意边数的多边形窗体

来源:互联网 发布:游戏机禁令 知乎 编辑:程序博客网 时间:2024/06/04 20:02

最近用C#的GDI编程做了几个小游戏,大概知道了这些2D小游戏的基本开发方法.以后我可能不会再蠢到在一个窗体上拖或者是用代码动态生成几十个picturebox控件来制作游戏了,233333...(当然明智之举还是用游戏引擎制作游戏,效率更高)

说些题外话,通过做这几个小游戏(有井字棋、泡泡堂等),我真正认识到了面向对象编程的强大,并强烈认为我小时候用vb控件拖出来的那个游戏(虽然看上去不错,但体积超大,性能弱爆,且根本不能拆分成独立模块,像是个丑陋笨重的工业时代机器)是极蠢的.面向对象迫使你对程序进行抽象,进行功能的分类,从而使程序能够被拆分成独立的模块,能够进行独立设计、调试测试、甚至是复用于他处.正如梁肇新说的,不能拆的程序是很臭的.在写这几个小游戏的时候,我深刻地意识到了这一点,有意识地使各个类模块之间耦合度尽可能地小、将太厚的代码块尽量拆成几个小的块,但我做的远远不够,当然,这是需要在实践中不断积累经验才能够练就的能力,所以啊,代码不能停啊,得劲敲~

进入正题,其实这个东西本身没有多深奥的知识,只要会简单的极坐标转换和几个GDI编程的函数就能写出来.代码如下:

/*绘制正多边形区域,将返回Region类对象,此对象可以直接赋值给窗体的region属性,这样窗体的形状就变成region勾出的图形了*/        public Region CreatePolygon(int sideQuantity, int maxLength)        {            //在窗体全屏模式下,定义中心点            int centreX = 800; int centreY = 400;            //剔除非多边形            if (sideQuantity < 3) return null;            //定义角增量,即多边形的各外角大小            double fixedAngle = 2 * Math.PI / sideQuantity;            double angle;            //图像路线,你可以看成是画图时的连线操作,区域一定要封闭!            GraphicsPath path = new GraphicsPath();            //循环,自动勾勒多边形            for (angle = 0; angle < 2 * Math.PI - fixedAngle; angle += fixedAngle)            {                //注意,由于像素的最小单位是1px,定义点时,X,Y坐标必须是整数!这里使用了强制转换                Point p1 = new Point((int)(centreX + maxLength * Math.Cos(angle)), (int)(centreY + maxLength * Math.Sin(angle)));                Point p2 = new Point((int)(centreX + maxLength * Math.Cos(angle + fixedAngle)), (int)(centreY + maxLength * Math.Sin(angle + fixedAngle)));                //添加直线到区域                path.AddLine(p1, p2);            }            //返回勾好的区域            return new Region(path);        }

在窗体的构造函数中添加如下代码:

this.Region =CreatePolygon(5, 100);//100是对称中心到各顶点的距离

编译,运行,结果如下:


但是,这样看,总感觉角度怪怪的.怎么能把它摆正?其实这就是一个起始点的问题啦,看,我们把函数中for循环的初始条件改一下:

for (angle = -Math.PI/ 2; angle < 2 * Math.PI - fixedAngle; angle += fixedAngle)

{

...

}



看,这样多美观...(好吧,哪里美观了...)
你还可以使用Timer控件,动态地传入边数参数,这样你就可以直观感受割圆术的魅力~

你也可以动态地传入起始角,窗体就会绕中心点旋转起来,看着是不是很欢乐很开森?

嗯,就写到这里吧,去吃饭了,吃过饭看书去...

0 0
原创粉丝点击