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