柚子快報邀請碼778899分享:C/C++跳動的愛心
系列文章
序號直達鏈接1C/C++李峋同款跳動的愛心2C/C++跳動的愛心3C/C++經(jīng)典愛心4C/C++滿屏飄字5C/C++大雪紛飛6C/C++炫酷煙花7C/C++黑客帝國同款字母雨8C/C++櫻花樹9C/C++奧特曼10C/C++精美圣誕樹11C/C++俄羅斯方塊小游戲12C/C++貪吃蛇小游戲13C/C++孤單又燦爛的神14C/C++閃爍的愛心15C/C++哆啦A夢16C/C++簡單圣誕樹17C/C++小宇宙18C/C++冰墩墩19C/C++七彩花朵20C/C++玫瑰花21C/C++小豬佩奇22C/C++簡易愛心23C/C++流星雨24C/C++2048小游戲25C/C++愛心圣誕樹26C/C++文字跑馬燈27C/C++教師工作量管理系統(tǒng)28C/C++滿天繁星29C/C++漂浮愛心30C/C++五子棋小游戲31C/C++球球大作戰(zhàn)小游戲32C/C++走迷宮小游戲33C/C++粉色愛心34C/C++跨年煙花35C/C++棕色小熊36C/C++粉色動態(tài)愛心37C/C++新春煙花敬請期待……
寫在前面
C/C++語言實現(xiàn)李峋同款跳動的愛心完整代碼。
首先,我們需要知道C++作為一種高級編程語言,擁有強大的功能和靈活的語法,非常適合用來制作各種有趣的動畫效果。而跳動的愛心,正是一種既簡單又富有創(chuàng)意的動畫效果,非常適合用來作為編程初學者的練習項目。要實現(xiàn)這個效果,我們需要用到C++的圖形庫和定時器功能。圖形庫可以幫助我們在控制臺或窗口中繪制出愛心的形狀,而定時器則可以讓愛心以一定的頻率跳動起來。
技術需求
圖形庫(Graphics Library):使用 graphics.h 提供的圖形功能來繪制點、圓形、文字等圖形元素。通過 setfillcolor、solidcircle、outtextxy 等函數(shù)來控制圖形的顏色、形狀和位置。 數(shù)學運算與公式:代碼使用了數(shù)學公式生成心形曲線的點坐標。特別是通過 sin 和 cos 函數(shù),結合參數(shù)方程繪制心形曲線。同時使用了距離計算公式 sqrt(pow(x, 2) + pow(y, 2)) 來處理點之間的關系。 隨機數(shù)生成:通過 rand() 函數(shù)生成隨機數(shù),用于隨機化圖形的顏色、大小、位置等,使得動畫效果更具動感和變化性。隨機數(shù)還被用來控制每個點是否生成。 動畫生成:通過逐幀生成圖像,利用 saveimage 和 loadimage 函數(shù)保存并加載每一幀圖像,實現(xiàn)動畫效果。每幀的點位置隨著時間變化,形成動態(tài)效果。 圖像處理:利用 setorigin、setaspectratio 等函數(shù)調整圖形坐標系,使得圖形能適應不同的屏幕分辨率和顯示效果。 文本繪制:使用 outtextxy 函數(shù)將文本繪制到圖形上,這里用來顯示"我愛你"等信息,增強圖形的表現(xiàn)力。 內存與性能管理:通過存儲每一幀的圖像,使用 images[frame] 數(shù)組來管理圖像數(shù)據(jù),確保每一幀能夠被獨立處理和保存。
環(huán)境搭建
環(huán)境:C/C++
軟件:Visual Studio 2022
安裝教程:C語言環(huán)境搭建教程(Visual Studio)
1. EasyX是什么
EasyX是一個專為C++初學者和愛好者設計的圖形庫。該庫以簡潔易用、功能實用為宗旨,通過封裝Windows GDI接口,極大降低了C++編程中圖形界面設計的復雜度,使得用戶能夠快速上手并實現(xiàn)各類圖形圖像處理任務。
EasyX提供了一系列豐富的API函數(shù),涵蓋了繪制基本圖形(如線段、圓形、矩形等)、填充圖形、顯示文本、加載與保存圖片、顏色設置以及鼠標鍵盤事件處理等功能。通過簡單的函數(shù)調用,開發(fā)者可以高效地進行2D圖形繪制和交互式程序設計。
總的來說,EasyX以其友好的學習曲線和高效的圖形處理能力,極大地激發(fā)了C++初學者對計算機圖形學的興趣,是廣大編程入門者和教育領域廣泛采用的一款圖形庫工具。
2. 下載安裝EasyX
?
1.進入EasyX官網(wǎng),點擊下載按鈕開始下載
2.下載完成后進入下載目錄,雙擊.exe文件無腦安裝即可
接下來,讓我們一步步來實現(xiàn)這個跳動的愛心。首先,我們需要通過一系列的數(shù)學公式來定義愛心的形狀,比如使用參數(shù)方程來描述愛心的輪廓。然后,我們可以使用C++的圖形庫來繪制出這個形狀。當繪制好愛心后,就要想辦法讓它跳動起來了,這里我們可以使用C++的定時器功能,設置一個合適的時間間隔,讓愛心在每個時間間隔內改變位置或大小,從而產生跳動的效果。
完整代碼
#include
#include
#include
#include
#include
struct Point {
double x, y;
COLORREF color;
};
const int MAX_POINTS = 256;
const COLORREF colors[MAX_POINTS] = {
RGB(255, 192, 203), // 淺粉色 (Light Pink)
RGB(255, 182, 193), // 淡粉紅 (LightPink)
RGB(255, 105, 180), // 熱粉紅 (HotPink)
RGB(255, 20, 147), // 深粉色 (DeepPink)
RGB(219, 112, 147), // 濃粉紅 (PaleVioletRed)
RGB(255, 174, 185), // 淺玫瑰紅 (LightPink)
RGB(255, 0, 144) // 紫紅色 (Crimson)
};
const int xScreen = GetSystemMetrics(SM_CXSCREEN);
const int yScreen = GetSystemMetrics(SM_CYSCREEN) - 100;
const double PI = 3.14159265359;
const double E = 2.71828;
const double AVG_DISTANCE = 0.162;
const int NUM_ORIGIN_POINTS = 506;
const int NUM_CIRCLES = 210;
const int NUM_FRAMES = 20;
const int COLOR_RANGE = 6;
Point origin_points[NUM_ORIGIN_POINTS];
Point points[NUM_CIRCLES * NUM_ORIGIN_POINTS];
IMAGE images[NUM_FRAMES];
int create_random(int min, int max) {
return rand() % (max - min + 1) + min;
}
void create_data() {
int index = 0;
double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
// Generate origin points
for (double radian = 0.1; radian <= 2 * PI; radian += 0.005) {
x2 = 16 * pow(sin(radian), 3);
y2 = 13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian);
double distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
if (distance > AVG_DISTANCE) {
x1 = x2, y1 = y2;
origin_points[index].x = x2;
origin_points[index++].y = y2;
}
}
// Generate points
index = 0;
for (double size = 0.1, lightness = 1.5; size <= 20; size += 0.1) {
double success_p = 1 / (1 + pow(E, 8 - size / 2));
if (lightness > 1) lightness -= 0.0025;
for (int i = 0; i < NUM_ORIGIN_POINTS; ++i) {
if (success_p > create_random(0, 100) / 100.0) {
COLORREF color = colors[create_random(0, COLOR_RANGE)];
points[index].color = RGB(GetRValue(color) / lightness, GetGValue(color) / lightness, GetBValue(color) / lightness);
points[index].x = size * origin_points[i].x + create_random(-4, 4);
points[index++].y = size * origin_points[i].y + create_random(-4, 4);
}
}
}
int points_size = index;
// Generate images
for (int frame = 0; frame < NUM_FRAMES; ++frame) {
images[frame] = IMAGE(xScreen, yScreen);
SetWorkingImage(&images[frame]);
setorigin(xScreen / 2, yScreen / 2);
setaspectratio(1, -1);
for (index = 0; index < points_size; ++index) {
double x = points[index].x, y = points[index].y;
double distance = sqrt(pow(x, 2) + pow(y, 2));
double distance_increase = -0.0009 * distance * distance + 0.35714 * distance + 5;
double x_increase = distance_increase * x / distance / NUM_FRAMES;
double y_increase = distance_increase * y / distance / NUM_FRAMES;
points[index].x += x_increase;
points[index].y += y_increase;
setfillcolor(points[index].color);
solidcircle(points[index].x, points[index].y, 1);
}
……
代碼分析
這段代碼使用了 C++ 中的圖形庫來生成一系列動畫圖像,并展示一個基于愛心形狀的圖案。下面將詳細分析該代碼的各個部分,包括結構體定義、常量聲明、函數(shù)實現(xiàn)和程序的執(zhí)行流程。
1. 引用的頭文件
#include
#include
#include
#include
#include
graphics.h:是 C++ 中的圖形處理庫,提供了用于繪制圖形和圖像的函數(shù)。conio.h:用于控制臺輸入輸出,包括 _kbhit()(檢測是否有按鍵輸入)等功能。ctime:用于獲取系統(tǒng)時間,主要用于生成隨機數(shù)。cmath:提供數(shù)學運算函數(shù),如 pow、sqrt 等。cstdlib:用于生成隨機數(shù)等操作。
2. 數(shù)據(jù)結構
struct Point {
double x, y;
COLORREF color;
};
定義了一個 Point 結構體,用來存儲二維坐標點的 x 和 y 值,以及一個 color 屬性,代表該點的顏色。COLORREF 是一個顏色的結構,通常包含 RGB 顏色值。
3. 常量聲明
const int MAX_POINTS = 256;
const COLORREF colors[MAX_POINTS] = {
RGB(255, 192, 203), RGB(255, 182, 193), RGB(255, 105, 180),
RGB(255, 20, 147), RGB(219, 112, 147), RGB(255, 174, 185), RGB(255, 0, 144)
};
const int xScreen = GetSystemMetrics(SM_CXSCREEN);
const int yScreen = GetSystemMetrics(SM_CYSCREEN) - 100;
const double PI = 3.14159265359;
const double E = 2.71828;
const double AVG_DISTANCE = 0.162;
const int NUM_ORIGIN_POINTS = 506;
const int NUM_CIRCLES = 210;
const int NUM_FRAMES = 20;
const int COLOR_RANGE = 6;
MAX_POINTS:最大點數(shù),表示圖像中最多可以包含 256 個點。colors:存儲了 7 種顏色的 RGB 值,表示動畫中使用的顏色范圍。xScreen, yScreen:獲取屏幕的寬度和高度,并為繪制圖像留出一些空間。PI 和 E:圓周率和自然常數(shù)。AVG_DISTANCE:用于計算點之間的平均距離。NUM_ORIGIN_POINTS:原始數(shù)據(jù)點的數(shù)量。NUM_CIRCLES:生成的圓形點的數(shù)量。NUM_FRAMES:動畫幀的數(shù)量。COLOR_RANGE:顏色范圍,用于選擇顏色的隨機數(shù)范圍。
4. 全局變量
Point origin_points[NUM_ORIGIN_POINTS];
Point points[NUM_CIRCLES * NUM_ORIGIN_POINTS];
IMAGE images[NUM_FRAMES];
origin_points:存儲原始的點數(shù)據(jù),用于計算圖案。points:存儲圖形中每個點的數(shù)據(jù),包括坐標和顏色。images:存儲每一幀生成的圖像。
5. 創(chuàng)建隨機數(shù)的輔助函數(shù)
int create_random(int min, int max) {
return rand() % (max - min + 1) + min;
}
這個函數(shù)用來生成一個指定范圍內的隨機整數(shù)。通過 rand() 函數(shù)生成一個隨機數(shù),然后通過模運算限制其在給定的區(qū)間內。
6. create_data() 函數(shù)
該函數(shù)是整個程序的核心,負責生成原始點數(shù)據(jù)、計算點的位置,并生成動畫的幀。
6.1 生成原始數(shù)據(jù)點
for (double radian = 0.1; radian <= 2 * PI; radian += 0.005) {
x2 = 16 * pow(sin(radian), 3);
y2 = 13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian);
double distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
if (distance > AVG_DISTANCE) {
x1 = x2, y1 = y2;
origin_points[index].x = x2;
origin_points[index++].y = y2;
}
}
這段代碼生成了一個心形曲線的原始數(shù)據(jù)點,使用了 parametric equations 來繪制心形。通過遍歷角度 radian,計算 x2 和 y2 的坐標,并根據(jù)距離過濾掉過于接近的點。
6.2 生成圓形點數(shù)據(jù)
這一部分通過變化 size 和 lightness,生成了不同大小、不同亮度的點。通過 success_p 來決定點是否應當被生成,最終生成的點被隨機設置顏色,并加入到 points 數(shù)組中。
6.3 生成動畫幀
這一段代碼是核心部分,負責繪制和動畫生成。
通過計算每個點的位置,繪制心形的各個點,并生成動態(tài)的效果。
7. 總結
這段代碼實現(xiàn)了一個基于心形圖案的動態(tài)生成動畫,涉及到數(shù)學公式、圖形繪制、隨機數(shù)生成等多個方面的知識。它通過逐幀繪制來創(chuàng)建動畫效果,并通過修改顏色、位置、大小等參數(shù)來實現(xiàn)動態(tài)展示。
寫在后面
我是一只有趣的兔子,感謝你的喜歡!
柚子快報邀請碼778899分享:C/C++跳動的愛心
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。