C/C++跳動的愛心

系列文章

序號直達鏈接
1C/C++李峋同款跳動的愛心
2C/C++跳動的愛心
3C/C++經典愛心
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++教師工作量管理系統
28C/C++滿天繁星
29C/C++漂浮愛心
30C/C++五子棋小游戲
31C/C++球球大作戰小游戲
32C/C++走迷宮小游戲
33C/C++粉色愛心
34C/C++跨年煙花
35C/C++棕色小熊
36C/C++粉色動態愛心
37C/C++新春煙花
敬請期待……

寫在前面

C/C++語言實現李峋同款跳動的愛心完整代碼。

首先,我們需要知道C++作為一種高級編程語言,擁有強大的功能和靈活的語法,非常適合用來制作各種有趣的動畫效果。而跳動的愛心,正是一種既簡單又富有創意的動畫效果,非常適合用來作為編程初學者的練習項目。要實現這個效果,我們需要用到C++的圖形庫和定時器功能。圖形庫可以幫助我們在控制臺或窗口中繪制出愛心的形狀,而定時器則可以讓愛心以一定的頻率跳動起來。

技術需求

  1. 圖形庫(Graphics Library):使用 graphics.h 提供的圖形功能來繪制點、圓形、文字等圖形元素。通過 setfillcolorsolidcircleouttextxy 等函數來控制圖形的顏色、形狀和位置。

  2. 數學運算與公式:代碼使用了數學公式生成心形曲線的點坐標。特別是通過 sincos 函數,結合參數方程繪制心形曲線。同時使用了距離計算公式 sqrt(pow(x, 2) + pow(y, 2)) 來處理點之間的關系。

  3. 隨機數生成:通過 rand() 函數生成隨機數,用于隨機化圖形的顏色、大小、位置等,使得動畫效果更具動感和變化性。隨機數還被用來控制每個點是否生成。

  4. 動畫生成:通過逐幀生成圖像,利用 saveimageloadimage 函數保存并加載每一幀圖像,實現動畫效果。每幀的點位置隨著時間變化,形成動態效果。

  5. 圖像處理:利用 setoriginsetaspectratio 等函數調整圖形坐標系,使得圖形能適應不同的屏幕分辨率和顯示效果。

  6. 文本繪制:使用 outtextxy 函數將文本繪制到圖形上,這里用來顯示"我愛你"等信息,增強圖形的表現力。

  7. 內存與性能管理:通過存儲每一幀的圖像,使用 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:提供數學運算函數,如 powsqrt 等。
  • cstdlib:用于生成隨機數等操作。

2. 數據結構

struct Point {double x, y;COLORREF color;
};

定義了一個 Point 結構體,用來存儲二維坐標點的 xy 值,以及一個 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:獲取屏幕的寬度和高度,并為繪制圖像留出一些空間。
  • PIE:圓周率和自然常數。
  • 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,計算 x2y2 的坐標,并根據距離過濾掉過于接近的點。

6.2 生成圓形點數據

這一部分通過變化 sizelightness,生成了不同大小、不同亮度的點。通過 success_p 來決定點是否應當被生成,最終生成的點被隨機設置顏色,并加入到 points 數組中。

6.3 生成動畫幀

這一段代碼是核心部分,負責繪制和動畫生成。

通過計算每個點的位置,繪制心形的各個點,并生成動態的效果。

7. 總結

這段代碼實現了一個基于心形圖案的動態生成動畫,涉及到數學公式、圖形繪制、隨機數生成等多個方面的知識。它通過逐幀繪制來創建動畫效果,并通過修改顏色、位置、大小等參數來實現動態展示。

寫在后面

我是一只有趣的兔子,感謝你的喜歡!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71761.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

量子計算的威脅,以及企業可以采取的措施

當谷歌、IBM、Honeywell和微軟等科技巨頭紛紛投身量子計算領域時&#xff0c;一場技術軍備競賽已然拉開帷幕。 量子計算雖能為全球數字經濟帶來巨大價值&#xff0c;但也有可能對相互關聯的系統、設備和數據造成損害。這一潛在影響在全球網絡安全領域引起了強烈關注。也正因如…

Unity制作游戲——前期準備:Unity2023和VS2022下載和安裝配置——附安裝包

1.Unity2023的下載和安裝配置 &#xff08;1&#xff09;Unity官網下載地址&#xff08;國際如果進不去&#xff0c;進國內的官網&#xff0c;下面以國內官網流程為例子&#xff09; unity中國官網&#xff1a;Unity中國官網 - 實時內容開發平臺 | 3D、2D、VR & AR可視化 …

23貪心算法

分發餅干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {int i0,j0;int count0;sort(s.begin(),s.end());sort(g.begin(),g.end());while(i<g.size()&&j<s.size()){if(g[i]<s[j]){i;j;count;}else…

Spark 和 Flink

Spark 和 Flink 都是目前流行的大數據處理引擎&#xff0c;但它們在架構設計、應用場景、性能和生態方面有較大區別。以下是詳細對比&#xff1a; 1. 架構與核心概念 方面Apache SparkApache Flink計算模型微批&#xff08;Micro-Batch&#xff09;為主&#xff0c;但支持結構…

Android 串口通信

引言 在iot項目中&#xff0c;Android 端總會有和硬件通信。 通信這里&#xff1a;串口通信&#xff0c;藍牙通信或者局域網通信。 這里講一下串口通信。 什么是串口&#xff1f; “串口”&#xff08;Serial Port&#xff09;通常是指一種用于與外部設備進行串行通信的接口。…

【計算機網絡】OSI模型、TCP/IP模型、路由器、集線器、交換機

一、計算機網絡分層結構 計算機網絡分層結構 指將計算機網絡的功能劃分為多個層次&#xff0c;每個層次都有其特定的功能和協議&#xff0c;并且層次之間通過接口進行通信。 分層設計的優勢&#xff1a; 模塊化&#xff1a;各層獨立發展&#xff08;如IPv4→IPv6&#xff0c…

從人機環境系統智能角度看傳統IP的全球化二次創作法則

從人機環境系統智能的視角看&#xff0c;傳統IP的全球化二次創作法則需結合技術、文化、倫理與環境的復雜協同。這一過程不僅是內容的本土化改編&#xff0c;更是人、機器與環境在動態交互中實現價值共創的體現。 一、人機環境系統智能的底層邏輯與IP二次創作的融合 1、感知層&…

實現 INFINI Console 與 GitHub 的單點登錄集成:一站式身份驗證解決方案

本文將為您詳細解析如何通過 GitHub OAuth 2.0 協議&#xff0c;為 INFINI Console 實現高效、安全的單點登錄&#xff08;Single Sign-On, SSO&#xff09;集成。通過此方案&#xff0c;用戶可直接使用 GitHub 賬戶無縫登錄 INFINI Console&#xff0c;簡化身份驗證流程&#…

記一次復雜分頁查詢的優化歷程:從臨時表到普通表的架構演進

1. 問題背景 在項目開發中&#xff0c;我們需要實現一個復雜的分頁查詢功能&#xff0c;涉及大量 IP 地址數據的處理和多表關聯。在我接手這個項目的時候,代碼是這樣的 要知道代碼里面的 ipsList 數據可能幾萬條甚至更多,這樣拼接的sql,必然是要內存溢出的,一味地擴大jvm參數不…

C++關鍵字之mutable

1.介紹 在C中&#xff0c;mutable是一個關鍵字&#xff0c;用于修飾類的成員變量。它的主要作用是允許在常量成員函數或常量對象中修改被標記為mutable的成員變量。通常情況下&#xff0c;常量成員函數不能修改類的成員變量&#xff0c;但有些情況下&#xff0c;某些成員變量的…

云計算中的API網關是什么?為什么它很重要?

在云計算架構中&#xff0c;API網關&#xff08;API Gateway&#xff09;是一個重要的組件&#xff0c;主要用于管理、保護和優化不同服務之間的接口&#xff08;API&#xff09;通信。簡單來說&#xff0c;API網關就像是一個中介&#xff0c;它充當客戶端和后端服務之間的“橋…

深搜專題2:組合問題

描述 組合問題就是從n個元素中抽出r個元素(不分順序且r < &#xff1d; n)&#xff0c; 我們可以簡單地將n個元素理解為自然數1&#xff0c;2&#xff0c;…&#xff0c;n&#xff0c;從中任取r個數。 例如n &#xff1d; 5 &#xff0c;r &#xff1d; 3 &#xff0c;所…

uniapp多端適配

UniApp是一個基于Vue.js開發多端應用的框架&#xff0c;它可以讓開發者編寫一次代碼&#xff0c;同時適配iOS、Android、Web等多個平臺。 環境搭建&#xff1a; UniApp基于Vue.js開發&#xff0c;所以需要先安裝Vue CLI npm install -g vue/cli 創建一個新的UniApp項目&…

Error [ERR_REQUIRE_ESM]: require() of ES Module

報錯信息&#xff1a; 【報錯】Message.js 導入方式不對&#xff0c;用的是 ES Moudle 的語法&#xff0c;提示使用 import 引入文件 項目開發沒有用到 js-message 依賴&#xff0c;是 node-ipc 依賴中用到的 js-message 依賴&#xff0c; node-ipc 中限制 js-message 版本&a…

給小米/紅米手機root(工具基本為官方工具)——KernelSU篇

目錄 前言準備工作下載刷機包xiaomirom下載刷機包【適用于MIUI和hyperOS】“hyper更新”微信小程序【只適用于hyperOS】 下載KernelSU刷機所需程序和驅動文件 開始刷機設置手機第一種刷機方式【KMI】推薦提取boot或init_boot分區 第二種刷機方式【GKI】不推薦 結語 前言 刷機需…

CSS通過webkit-scrollbar設置滾動條樣式

查看::-webkit-scrollbar-*各項關系 以下圖為例&#xff0c;可以分別定義滾動條背景、滾動軌道、滾動滑塊的樣式。 需要先給外部容器設置高度&#xff0c;再設置overflow: auto&#xff0c;最后設置三個webkit屬性。 <!DOCTYPE html> <html lang"en">…

自制操作系統前置知識匯編學習

今天要做什么&#xff1f; 為了更好的理解書中內容&#xff0c;需要學習下進制分析和匯編。 匯編語言其實應該叫叫機器指令符號化語言&#xff0c;目前的匯編語言是學習操作系統的基礎。 一&#xff1a;觸發器 電路觸發器的鎖存命令默認是斷開的&#xff0c;是控制電路觸發器…

uCOSIII-移植

一、uCOS移植 1.移植 C/OS-III前&#xff0c;需要獲取C/OS-III 的源代碼&#xff0c;C/CPU 和 C/LIB 這兩個組件的源代碼。 2.將獲取的uCOSIII源代碼添加到工程文件中&#xff1a; ①.uC-CPU/ARM-Cortex-M/ARMv7-M/ARM/cpu_a.asm、uC-CPU\ARM-Cortex-M\ARMv7-M\cpu_c.c 和 uC-…

Windows使用docker部署fastgpt出現的一些問題

文章目錄 Windows使用docker部署FastGPT出現的一些問題1.docker部署pg一直重啟的問題2.重啟MongoDB之后一直出現“Waiting for MongoDB to start...”3.oneapi啟動不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出現的一些問題 1.docker部署pg一…

【Python爬蟲(52)】探秘Scrapy:項目結構與配置全解析

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…