C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案
思路
如何使用 C 語(yǔ)言配置EasyX繪圖庫(kù)繪制一個(gè)足球呢,今天我嘗試了一下,難度還算可以,但是過程比較繁瑣,代碼寫的有些復(fù)雜,后期有興趣的,可以在我的代碼的基礎(chǔ)上進(jìn)行優(yōu)化,用更短的代碼將這個(gè)圖形繪制出來。
簡(jiǎn)單描述一下這個(gè)程序的思路和實(shí)現(xiàn)過程。足球是一個(gè)由五邊形和六邊形組成的球體。這里我使用一個(gè)旋轉(zhuǎn)算法,首先確定一個(gè)足球的圓心。然后確定半徑,通過等間距旋轉(zhuǎn),先獲得一個(gè)五邊形的坐標(biāo),使用多邊形填充的方式,得到一個(gè)填充的五邊形。然后通過同樣的方式,獲取一個(gè)十邊形以及二十邊形的坐標(biāo)。然后按照一定規(guī)律連接這些坐標(biāo)點(diǎn)。
以上只是我個(gè)人的思路,當(dāng)然有更好的思路可以進(jìn)行計(jì)算和繪制,例如足球是個(gè)球體,可以使用 EasyX 繪圖庫(kù),通過計(jì)算每一個(gè)多邊形角點(diǎn)在三維空間中的位置,就可以繪制出一個(gè)三維的足球。當(dāng)然這個(gè)就需要有一定的數(shù)學(xué)邏輯能力和計(jì)算機(jī)圖形學(xué)的知識(shí)了。
截圖

源碼
///
// 程序名稱:繪制足球
// 編譯環(huán)境: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); // 繪制一個(gè)球形狀
setlinestyle(PS_SOLID, 2);
POINT pts[5];
POINT Fpts[5];
POINT Zpts[5];
// 計(jì)算五邊形的五個(gè)頂點(diǎn)坐標(biāo)
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;
}到此這篇關(guān)于C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案的文章就介紹到這了,更多相關(guān)C語(yǔ)言EasyX繪制足球內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)
這篇文章主要是介紹了利用深度優(yōu)先算法實(shí)現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實(shí)現(xiàn)步驟,對(duì)我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下2021-12-12
深入了解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,需要的可以參考一下2022-06-06
帶頭結(jié)點(diǎn)單鏈表與不帶頭結(jié)點(diǎn)單鏈表的區(qū)別
這篇文章主要介紹了帶頭結(jié)點(diǎn)單鏈表與不帶頭結(jié)點(diǎn)單鏈表的區(qū)別,需要的朋友可以參考下2023-07-07
Qt之簡(jiǎn)單的異步操作實(shí)現(xiàn)方法
這篇文章主要介紹了Qt之簡(jiǎn)單的異步操作實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

