最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用easyX庫實現(xiàn)三星環(huán)繞效果流程詳解

 更新時間:2022年10月28日 14:46:05   作者:EMCred  
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫實現(xiàn)三星環(huán)繞效果,需要的可以參考一下

1,項目描述

功能1:使用圖形化的方式描述地球圍繞著太陽轉(zhuǎn)動,月球圍繞著地球轉(zhuǎn)動

功能2:在轉(zhuǎn)動的過程中當用戶按下1,2,3,4,5,6,7時它可以變換出7種不同的顏色,當用戶按下8時它可以變換從1-7的顏色依次變換當用戶再次按下8鍵時停止變換顏色

功能3:當用戶按下上鍵時,地球會圍繞太陽反轉(zhuǎn),當再次按下上鍵時地球會恢復(fù)到正轉(zhuǎn)

功能4:當用戶按下空格鍵的時候,所有動畫暫停,當再次按下空格鍵的時候所有動畫繼續(xù)進行。

2,解決思路

其實縱觀整個項目需求,在不考慮真實的星體運算下,它的實現(xiàn)原理就像是時鐘轉(zhuǎn)動的實現(xiàn)原理是一致的

對于地球圍繞著太陽進行轉(zhuǎn)動來說,可以將太陽作為中心點,地球圍繞著這個中心點進行轉(zhuǎn)動,對于月球圍繞著地球進行轉(zhuǎn)動來說,可以將地球作為一個中心點,月球圍繞著地球進行轉(zhuǎn)動,這樣就實現(xiàn)了基本的地球,太陽和月球的三星環(huán)繞

需要考慮的是整個項目是在轉(zhuǎn)動中獲取按鍵信息做出相應(yīng)的畫面更新,所以按鍵更新畫面應(yīng)該是放在一個非阻塞的函數(shù)下進行,也就是使用_kbhit()來實現(xiàn),將這個條件放在運行中的死循環(huán)之中,可以隨時通過按鍵信息更新畫面基本元素

當考慮到8鍵,空格鍵和上鍵時,它們?nèi)齻€鍵位就相當于開關(guān),按下就開,再按就關(guān),我可以使用開關(guān)算法完成這樣的操作。

3,關(guān)鍵代碼

開發(fā)使用IDE:Visual Studio2019

注意:

easyX庫不是C++的自帶庫需要下載和安裝,很簡單

easyX庫是基于C++的,所以文件的后綴名需要改為.cpp才能正常運行

首先為了方便程序的可維護性,所以最開始,使用了枚舉定義了地球,月球和太陽的半徑。

typedef enum RADIES {//星球半徑
    sunradies = 150,//太陽
    earthradies = 30,//地球
    moonradies = 5,//月亮
}radies;

然后為了能實現(xiàn)色彩的變化,也可以先定義一個顏色的枚舉,顏色是基于easyX庫中的。

typedef enum COLOR {//顏色
    black = 0,//黑色
    blue = 0xAA0000,//藍色
    green = 0x00AA00,//綠色
    cyan = 0xAAAA00,//青色
    red = 0x0000AA,//紅色
    magenta = 0xAA00AA,//紫色
    brown = 0x0055AA,//棕色
    lightgray = 0xAAAAAA,//淺灰
    yellow = 0x55FFFF,//黃色
}color;
  • 實現(xiàn)基本的地球,太陽和月球三星環(huán)繞關(guān)鍵代碼

可以看作是三個中心點之間的不斷的運算關(guān)系,最核心的是通過不斷更新中心坐標的位置實現(xiàn),對于太陽來說,它的中心坐標是位于窗口的中心,并且對于太陽來說它是不動的,對于地球來說,它的中心坐標是根據(jù)以太陽為中心基點,圍繞著太陽進行轉(zhuǎn)動的,對于月球來說,亦然,地球和月球都是行星,它們的運動是依靠著坐標點的位置變化實現(xiàn),所以可以定義一個行星結(jié)構(gòu)體,包含行星的半徑和行星中心x和y坐標

typedef struct Plant {//行星
    int radies;//行星半徑
    int center_x;//行星中心X坐標
    int center_y;//行星中心Y坐標
}plant;

在程序中先創(chuàng)建行星,也就是為行星賦予基本的中心點和半徑作初始化,然后,通過繪制行星,傳入行星實時更新的坐標點在死循環(huán)中更新圖像。

//通過傳入結(jié)構(gòu)體指針首先給指針所指向的內(nèi)存地址中的相關(guān)屬性賦初值
void creatplant(plant* p, int x, int y, int radies) {
p->center_x = x;//行星中心的初始x坐標
p->center_y = y;//行星中心的初始y坐標
p->radies = radies;//行星的半徑
}

通過傳入中心行星和環(huán)繞行星,使用指針來訪問內(nèi)存空間,通過修改內(nèi)存中的數(shù)值實現(xiàn)實時改變終點坐標

void drawplant(plant* p1, plant* p2, double angle, int a, color c, radies r) {
p1->center_x = p2->center_x + (WIDTH / a) * sin(angle);//以p2為中心,實時改變角度改變內(nèi)存的x值
p1->center_y = p2->center_y - (WIDTH / a) * cos(angle);//以p2為中心,實時改變角度改變內(nèi)存的y值
setfillcolor(c);
solidcircle(p1->center_x, p1->center_y, p1->radies);//根據(jù)改變的值繪制圖形
}

直接繪制太陽,因為太陽就是一個靜止的狀態(tài):

//因為太陽它是固定的就是一個靜態(tài)圖片
void drawsun(color c, int x, int y, radies r) {
setfillcolor(c);
solidcircle(x, y, r);
}

接下來就可在主方法中進行繪制的實驗了

int main(){
    plant s, e, m;
    color c1=red;
    creatplant(&s, WIDTH / 2, HEIGHT / 2, sunradies);//創(chuàng)建太陽屬性
    creatplant(&e, WIDTH / 8, HEIGHT / 8, earthradies);//創(chuàng)建地球?qū)傩?
    creatplant(&m, WIDTH / 10, HEIGHT / 10, moonradies);//創(chuàng)建月球?qū)傩?
    while (1) {
        drawsun(c1, s.center_x, s.center_y, sunradies);//畫太陽
        BeginBatchDraw();在內(nèi)存中繪畫,避免頻閃
        drawplant(&e, &s, eangle, 3, blue, earthradies);//傳入地球,更新角度并且繪制
        drawplant(&m, &e, mangle, 13, yellow, moonradies);//傳入月球,更新角度并且繪制
        eangle = eangle + 2 * PI / 60;//地球的角度實時變化
        mangle = mangle + 2 * PI / 30;//月球的角度實時變化,分的分數(shù)應(yīng)該更小如果等于60一起轉(zhuǎn)動
        Sleep(50); //便于看出軌跡的運動
        FlushBatchDraw();//將畫出的內(nèi)容從內(nèi)存調(diào)出
        clearcircle(e.center_x, e.center_y, earthradies);//清除
        clearcircle(m.center_x, m.center_y, moonradies);//清除,再畫下一次的更新
    }
    return 0;
}

實驗截圖:

  • 開關(guān)算法思想關(guān)鍵代碼

該代碼用于主方法中控制整個程序的流程,其關(guān)鍵部分如下,56,32,72是鍵值,也就是在鍵盤中它都有對應(yīng)的值

int i = 1;//作為閃爍顏色的開關(guān)
int m1 = 1;//作為暫停的開關(guān)
int n1 = 1;//作為逆時針轉(zhuǎn)動的開關(guān)
while (key != 27) {
    if (_kbhit()) {//使用的非阻塞方法,也就是它不會等待事件的發(fā)生而阻塞是一直接收事件
    switch (key = _getch()) {
        case 56:i = i * -1; break;//當按下8鍵時,i=-1<0,進行顏色變換,當再按下8鍵時,i>0,不變
        case 32:m1 = m1 * -1; break;//按下空格時<0,再按下時>0
        case 72:n1 = n1 * -1; break;//按下上時<0,再按下時>0
    }
}
if (i < 0) {//進行顏色的變換
    color c[8] = { black,blue,red,blue,yellow,cyan,magenta,blue };
    srand((unsigned)time(NULL));
    int n = rand() % 8;
    Sleep(1);
    drawsun(c[n], s.center_x, s.center_y, sunradies);
}
if (m1 > 0) {//只有當m1>0時才會改變角度,當m1<0時不再改變
    if (n1 > 0) {//當n1>0時才會正轉(zhuǎn),<0時走反轉(zhuǎn)
        eangle = eangle + 2 * PI / 60;
        mangle = mangle + 2 * PI / 30;
    }
    else {
        eangle = eangle - 2 * PI / 60;
        mangle = mangle - 2 * PI / 30;
    }
    }
}

4,項目運行截圖

5,具體代碼實現(xiàn)

#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define WIDTH 800//窗口的寬
#define HEIGHT 800//窗口的高
#define PI 3.14159//PI
typedef enum RADIES {//星球半徑
	sunradies = 150,//太陽
	earthradies = 30,//地球
	moonradies = 5,//月亮
}radies;
typedef enum COLOR {//顏色
	black = 0,//黑色
	blue = 0xAA0000,//藍色
	green = 0x00AA00,//綠色
	cyan = 0xAAAA00,//青色
	red = 0x0000AA,//紅色
	magenta = 0xAA00AA,//紫色
	brown = 0x0055AA,//棕色
	lightgray = 0xAAAAAA,//淺灰
	yellow = 0x55FFFF,//黃色
}color;
typedef struct Plant {//行星
	int radies;//行星半徑
	int center_x;//行星中心X坐標
	int center_y;//行星中心Y坐標
}plant;
void drawsun(color c, int x, int y, radies r);//繪制太陽
void creatplant(plant* p, int x, int y, int radies);//創(chuàng)建星球
void drawplant(plant* p1, plant* p2, double angle, int a, color c, radies r);//繪制星球
int main()
{
	plant s, e, m;
	creatplant(&s, WIDTH / 2, HEIGHT / 2, sunradies);//創(chuàng)建太陽屬性
	creatplant(&e, WIDTH / 8, HEIGHT / 8, earthradies);//創(chuàng)建地球?qū)傩?
	creatplant(&m, WIDTH / 10, HEIGHT / 10, moonradies);//創(chuàng)建月球?qū)傩?
	color c1 = red;
	initgraph(WIDTH, HEIGHT);
	double eangle = 0;
	double mangle = 0;
	char key = 0;
	int i = 1;//作為閃爍顏色的開關(guān)
	int m1 = 1;//作為暫停的開關(guān)
	int n1 = 1;//作為逆時針轉(zhuǎn)動的開關(guān)
	while (key != 27) {
		if (_kbhit()) {
			switch (key = _getch()) {
			case 49:c1 = blue; break;
			case 50:c1 = yellow; break;
			case 52:c1 = brown; break;
			case 53:c1 = magenta; break;
			case 54:c1 = red; break;
			case 55:c1 = lightgray; break;
			case 56:i = i * -1; break;
			case 32:m1 = m1 * -1; break;
			case 27:break;
			case 72:n1 = n1 * -1; break;
			}
			drawsun(c1, s.center_x, s.center_y, sunradies);
		}
		drawsun(c1, s.center_x, s.center_y, sunradies);
		if (i < 0) {
			color c[8] = { black,blue,red,blue,yellow,cyan,magenta,blue };
			srand((unsigned)time(NULL));
			int n = rand() % 8;
			Sleep(1);
			drawsun(c[n], s.center_x, s.center_y, sunradies);
		}
		BeginBatchDraw();
		drawplant(&e, &s, eangle, 3, blue, earthradies);
		drawplant(&m, &e, mangle, 13, yellow, moonradies);
		if (m1 > 0) {
			if (n1 > 0) {
				eangle = eangle + 2 * PI / 60;
				mangle = mangle + 2 * PI / 30;
			}
			else {
				eangle = eangle - 2 * PI / 60;
				mangle = mangle - 2 * PI / 30;
			}
		}
		Sleep(50);
		FlushBatchDraw();
		clearcircle(e.center_x, e.center_y, earthradies);
		clearcircle(m.center_x, m.center_y, moonradies);
	}
	EndBatchDraw();
	_getch();
	closegraph();
	return 0;
}
void drawsun(color c, int x, int y, radies r) {
	setfillcolor(c);
	solidcircle(x, y, r);
}
void creatplant(plant* p, int x, int y, int radies) {
	p->center_x = x;
	p->center_y = y;
	p->radies = radies;
}
void drawplant(plant* p1, plant* p2, double angle, int a, color c, radies r) {
	p1->center_x = p2->center_x + (WIDTH / a) * sin(angle);
	p1->center_y = p2->center_y - (WIDTH / a) * cos(angle);
	setfillcolor(c);
	solidcircle(p1->center_x, p1->center_y, p1->radies);
}
/*
地球要圍繞著太陽轉(zhuǎn)動
月球要圍繞著地球轉(zhuǎn)動
按下1-7的按鍵時,太陽會變色
按下8的時候太陽會依次的變色
當按下空格鍵的時候,太陽會停止轉(zhuǎn)動
當按下上鍵的時候地球和月亮?xí)嫦虻霓D(zhuǎn)動,再按下上鍵的時候,地球和月亮?xí)槙r針轉(zhuǎn)動
*/

到此這篇關(guān)于C++使用easyX庫實現(xiàn)三星環(huán)繞效果流程詳解的文章就介紹到這了,更多相關(guān)C++三星環(huán)繞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ STL vector的模擬實現(xiàn)

    C++ STL vector的模擬實現(xiàn)

    這篇文章主要介紹了C++ STL vector的模擬實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C語言簡明講解類型轉(zhuǎn)換的使用與作用

    C語言簡明講解類型轉(zhuǎn)換的使用與作用

    類型轉(zhuǎn)換(type?cast),是高級語言的一個基本語法。它被實現(xiàn)為一個特殊的運算符,以小括號內(nèi)加上類型名來表示,接下來讓我們一起來詳細了解
    2022-04-04
  • 詳解C/C++如何發(fā)送與接收Kafka消息

    詳解C/C++如何發(fā)送與接收Kafka消息

    系統(tǒng)之間通信方式很多如:系統(tǒng)之間調(diào)用(http/rpc等),異步間接調(diào)用如發(fā)送消息、公共存儲等,算法工程為C/C++工程,本文將介紹如何在C/C++中如何發(fā)送與接收Kakfa消息(包含:Kafka的SASL認證方式),并提供了詳細的源碼和講解,需要的朋友可以參考下
    2024-07-07
  • C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等)

    C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等)

    這篇文章主要介紹了C語言中單鏈表的基本操作(創(chuàng)建、銷毀、增刪查改等),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • VSCode C++多文件編譯的簡單使用方法

    VSCode C++多文件編譯的簡單使用方法

    這篇文章主要介紹了VSCode C++多文件編譯的簡單使用方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • C語言實現(xiàn)哈希搜索算法及原理詳解

    C語言實現(xiàn)哈希搜索算法及原理詳解

    本文主要介紹了C語言實現(xiàn)哈希搜索算法及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • VS?Code?C++環(huán)境的搭建過程

    VS?Code?C++環(huán)境的搭建過程

    這篇文章主要介紹了VS?Code?C++環(huán)境的搭建,Somasegar 也告訴筆者這款編輯器也擁有對 Git 的開箱即用的支持,需要的朋友可以參考下
    2022-04-04
  • C語言運算符及其優(yōu)先級匯總表口訣

    C語言運算符及其優(yōu)先級匯總表口訣

    由于C語言的運算符優(yōu)先級與C++的不完全一樣(主要是增加了幾個運算符),所以這個口訣不能完全實用于C++.但是應(yīng)該能夠兼容,大家可以比較一下他們的區(qū)別應(yīng)該就能夠很快掌握C++的優(yōu)先級的
    2013-07-07
  • C語言實現(xiàn)反彈球游戲

    C語言實現(xiàn)反彈球游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)反彈球游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

茶陵县| 印江| 枞阳县| 尖扎县| 英山县| 老河口市| 新巴尔虎左旗| 宾阳县| 东光县| 应城市| 东丰县| 水城县| 中山市| 浑源县| 海晏县| 湟中县| 渭南市| 甘谷县| 德化县| 兰溪市| 九江市| 罗源县| 闽清县| 安庆市| 五大连池市| 淮阳县| 肃南| 西峡县| 陆川县| 古丈县| 庄河市| 太保市| 黄冈市| 洛南县| 福安市| 盐山县| 宁海县| 安康市| 平塘县| 久治县| 翁源县|