C语言利用EasyX实现绘制足球图案
编程小鱼六六六 人气:0思路
如何使用 C 语言配置EasyX绘图库绘制一个足球呢,今天我尝试了一下,难度还算可以,但是过程比较繁琐,代码写的有些复杂,后期有兴趣的,可以在我的代码的基础上进行优化,用更短的代码将这个图形绘制出来。
简单描述一下这个程序的思路和实现过程。足球是一个由五边形和六边形组成的球体。这里我使用一个旋转算法,首先确定一个足球的圆心。然后确定半径,通过等间距旋转,先获得一个五边形的坐标,使用多边形填充的方式,得到一个填充的五边形。然后通过同样的方式,获取一个十边形以及二十边形的坐标。然后按照一定规律连接这些坐标点。
以上只是我个人的思路,当然有更好的思路可以进行计算和绘制,例如足球是个球体,可以使用 EasyX 绘图库,通过计算每一个多边形角点在三维空间中的位置,就可以绘制出一个三维的足球。当然这个就需要有一定的数学逻辑能力和计算机图形学的知识了。
截图
源码
/// // 程序名称:绘制足球 // 编译环境:Mictosoft Visual Studio 2013, EasyX_20200315(beta) // #include<graphics.h> #include<math.h> #include<conio.h> #define PI acos(-1.0) int main() { initgraph(640, 480); setbkcolor(GREEN); setlinecolor(BLACK); cleardevice(); setlinestyle(PS_SOLID, 4); setfillcolor(WHITE); fillcircle(320, 240, 150); // 绘制一个球形状 setlinestyle(PS_SOLID, 2); POINT pts[5]; POINT Fpts[5]; POINT Zpts[5]; // 计算五边形的五个顶点坐标 double a = PI / 2; for (int i = 0; i < 5; i++) { pts[i].x = int(320 + cos(a) * 60); pts[i].y = int(240 - sin(a) * 60); Zpts[i].x = int(320 + cos(a) * 100); Zpts[i].y = int(240 - sin(a) * 100); Fpts[i].x = int(320 + cos(a) * 110); Fpts[i].y = int(240 - sin(a) * 110); a += PI * 2 / 5; } setlinecolor(BLACK); setfillcolor(BLACK); solidpolygon(pts, 5); for (int i = 0; i < 5; i++) { line(pts[i].x, pts[i].y, Zpts[i].x, Zpts[i].y); } POINT Spts[10]; POINT Wpts[20]; a = PI / 2 + PI / 20; for (int i = 0; i < 20; i++) { Wpts[i].x = int(320 + cos(a) * 150); Wpts[i].y = int(240 - sin(a) * 150); a += PI * 1 / 10; } a = PI / 2 + PI / 10; for (int i = 0; i < 10; i++) { Spts[i].x = int(320 + cos(a) * 128); Spts[i].y = int(240 - sin(a) * 128); a += PI * 1 / 5; } int P = 9; for (int i = 0; i < 5; i++) { line(Zpts[i].x, Zpts[i].y, Spts[P].x, Spts[P].y); P++; if (P == 10) { P = 0; } line(Zpts[i].x, Zpts[i].y, Spts[P].x, Spts[P].y); P++; } for (int i = 0; i < 9; i++) { line(Spts[i].x, Spts[i].y, Spts[i + 1].x, Spts[i + 1].y); i++; } int PS = 0; for (int i = 0; i < 20; i++) { if (i % 2 == 0) { if (PS % 2 == 0) { line(Wpts[i].x, Wpts[i].y, Spts[i / 2].x, Spts[i / 2].y); } else { line(Wpts[i + 1].x, Wpts[i + 1].y, Spts[i / 2].x, Spts[i / 2].y); } PS++; } } polygon(Wpts, 20); setlinestyle(PS_SOLID, 3); circle(320, 240, 150); setfillcolor(BLACK); for (int i = 0; i < 5; i++) { floodfill(Fpts[i].x, Fpts[i].y, BLACK); } _getch(); return 0; }
加载全部内容