利用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 (angle = -Math.PI/ 2; angle < 2 * Math.PI - fixedAngle; angle += fixedAngle)
{
...
}
看,这样多美观...(好吧,哪里美观了...)
你还可以使用Timer控件,动态地传入边数参数,这样你就可以直观感受割圆术的魅力~
你也可以动态地传入起始角,窗体就会绕中心点旋转起来,看着是不是很欢乐很开森?
嗯,就写到这里吧,去吃饭了,吃过饭看书去...
- 利用GDI绘制任意边数的多边形窗体
- 利用GDI+绘制任意边数的多边形窗体
- 设置背景透明的窗体,GDI+绘制异形WINFORM
- MFC 用gdi绘制填充多边形区域
- 利用GDI+实现常见图片格式任意转换的函数
- 任意多边形的面积
- 任意多边形的面积
- 任意多边形的面积
- 3D编程-绘制任意多边形
- oepngl绘制变动的多边形之glRotatef函数的利用
- 利用GDI+绘制验证码
- SetWindowRgn函数应用--截图,绘制多边形窗体
- 利用GDI+、贝塞尔曲线绘制一个带曲线的矩形
- 多边形面的绘制
- js调用百度地图接口绘制任意多边形并获取每个点的经纬度
- 百度地图接口绘制任意多边形并获取每个点的经纬度
- 百度地图接口绘制任意多边形并获取每个点的经纬度
- 利用坐标求任意多边形面积
- uml九种图之类图 对象图
- 关于微信小程序
- Java中的Random()函数
- 接口测试-汇总
- Google Chrome探秘之Console初探
- 利用GDI+绘制任意边数的多边形窗体
- 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
- git 错误 fatal: Not a valid object name: 'master'.
- 选择、冒泡、快速、归并、插入排序算法的运行时间比较
- Struts2拦截器实现异常处理
- C语言之坑:sizeof与strlen
- 润乾报表-单元格函数
- Mathematica提高运算速度的几种方法
- connect实现非阻塞模式