亲宝软件园·资讯

展开

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;
}

加载全部内容

相关教程
猜你喜欢
用户评论