动态爱心(C/C++)
首先來看效果
C/C++動態愛心
源代碼(代碼思路主要參考了b站up主碼農天高)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #include<time.h> #include<windows.h> #include<graphics.h> #include<mmsystem.h>//要調用mciSendString必須包含這個頭文件 #pragma comment(lib,"WINMM.LIB");//及這個預處理 #define SIZE 9 #define CANVAS_WIDTH 640 #define CANVAS_HEIGHT 480 #define CANVAS_CEBTER_X CANVAS_WIDTH / 2 #define CANVAS_CEBTER_Y CANVAS_HEIGHT / 2 void scatter_inside(int xo, int yo, double beta = 0.1) {//隨機內部擴散double ratio_x = -beta * log(rand());double ratio_y = beta * log(rand());double x, y;x = ratio_x * xo;y = ratio_y * yo;putpixel(x, y, RGB(245,145,247)); } void heart(int particle,double ratio,COLORREF color) {double x, y;//記錄直角坐標double i;//控制循環和心的精細程度//笛卡爾愛心//for (i = 0; i <= 2 * size; i += 0.1)//{// m = i;// n = -size * (((sin(i) * sqrt(fabs(cos(i)))) / (sin(i) + 1.4142)) - 2 * sin(i) + 2);// x = n * cos(m) + xo;// y = n * sin(m) + yo;// putpixel(x, y, color);//}for (i = 0; i <= 2 * particle; i += 0.001){//關鍵,畫愛心的公式x = 16 * (sin(i) * sin(i)* sin(i));y = -(13 * cos(i) - 5 * cos(2 * i) - 2 * cos(3 * i) - cos(4 * i));//控制愛心的大小x = x * ratio;y = y * ratio;putpixel(x, y, color);//擴散if((int)(i*10000)% 7 == 0)//擴散粒子太多了,控制粒子產生量scatter_inside(x, y);if ((int)(i * 10000) % 107 == 0)scatter_inside(x, y, 0.07);//愛心里面加字settextcolor(RGB(91, 176, 179));//設置愛心字體顏色settextstyle(40, 0, L"楷體");outtextxy(0, 0, L"喵");}}int main() {srand(time(0));initgraph(CANVAS_WIDTH, CANVAS_HEIGHT);//添加音樂mciSendString(L"open youhebuke.mp3 alias music", 0, 0, 0);mciSendString(L"play music repeat",0,0,0);//+repeat循環播放 -----------------------------------------------------------------------------------------//開頭界面,可刪除settextcolor(RGB(245,152,173));//顏色參數調配,畫圖板查看顏色參數settextstyle(15, 0, L"宋體");outtextxy(300, 300, L"----被虐的喵");settextcolor(RGB(91, 176, 179));//顏色參數調配,畫圖板查看顏色參數settextstyle(40, 0, L"楷體");outtextxy(175, 180, L"C/C++版跳動愛心");fflush(stdout);Sleep(10000);cleardevice();//清畫布,重新畫 -----------------------------------------------------------------------------------------setorigin(CANVAS_CEBTER_X, CANVAS_CEBTER_Y);//循環播放while (1){double ratio;//控制粒子頻率和圖像大小for (int i = 140; i <= 250; i++){ratio = 16 * sin(i / 360.0 * 3.1415926535);}if (ratio < 0){ratio *= -1;}//Sleep(10);heart(80, ratio, RED);cleardevice();}mciSendString(L"close music", 0, 0, 0);getchar();closegraph();return 0; }?這次寫的代碼有點臭,耦合度太高了,以至于修改一個參數會導致整體改變。于是就沒實現愛心跳動了。
一,下載一個可視化庫,推薦easyx
直接去官網下載https://easyx.cn/
下載好后會有這個exe文件
打開文件,點下一步到這個界面
?選擇你要配置的編譯器,它就會自動幫你將庫配置好。
第二步 將所要的頭文件,畫布大小設置好
第三步 初始化畫布,并畫一個普通的愛心
最初我用的笛卡爾公式。畫出來的愛心并不是很好看。我在網上不斷找也找不到滿意的公式,最終還是借用了b站up碼農天高找的這個公式
?
?為什么要手動控制呢?因為最初創建窗口位置默認坐標為
四 愛心渲染
接下來要對這個愛心渲染,就要不斷在它每個點的周圍隨機渲染一些點,?這里就需要獲取每個點的坐標,但是由于函數只能返回一個值,我也沒用類。所以直接在heart函數內部寫了個渲染函數
又因為隨機所以用到rand(),產生隨機數,至于這個scatter_inside函數實現思路我依舊是參考up主碼農天高的。
參數我沒控制好,就變成這樣了。反正自己根據畫布和畫的愛心大小,慢慢調去
對了,這里顏色是可以控制的?
使用RGB(xxx,xxx,xxx)紅綠藍的參數,而如果像按照自己喜歡的顏色調,打開畫圖板
點擊編輯顏色,里面就有顏色參數、
?
?第五步 讓愛心按一定頻率波動起來
也就是畫n張大小不同的連續圖,循環播放,這里頻率控制我用的是正選函數sin,這里就是我自己找到公式實現了,
我選的是這個頻率段,這樣既可以讓愛心收縮也放大,但是由于我寫的耦合性太高,導致不能輕易改頻率,會導致改變愛心大小。以及如果每次愛心動起來,縮放,周圍粒子坐標也要有一定改變,但由于我能力有限,再加上耦合度高,全用函數實現,難以獲得坐標,所以我就沒實現了。
將sin函數公式轉為代碼?
?
這時我也不用size控制大小了,直接用ratio,反正這個愛心大小自己慢慢調。
基本上這就是我的愛心實現流程了。
補:添加音樂和漢字
添加音樂用到的函數有??? ?mciSendString();
要包含
這兩個,不然會出現鏈接錯誤
我來解釋一下怎么使用
?首先將你要加入的xxx.mp3音樂放入所在路徑
右鍵這里,打開所在文件夾,將音樂放入其中
然后使用mciSendString(L"open xxx.mp3 alias music",0,0,0)
這些字符串意思是open打開音樂文件(open是系統調用接口),給它命名music.?傳3個000參數過去。
然后再調用mciSendString(L"play music repeat",0,0,0);
播放music 后面repeat可以不加,不加只播放一次,加了就是重復播放。
?添加漢字
這個數easyx提供的函數接口,具體使用參考EasyX 文檔 - 文字輸出相關函數
這里僅提供在愛心里插入文字
將他們放入heart函數里,在愛心和隨機散射粒子畫出來后,在執行這三行代碼
outtextxy(坐標,坐標,L"文本內容");
這里坐標參考第一步畫的愛心位置來估計大概范圍
outtextxy可多次調用,多次輸入。?
這是鄙人第一次學習使用eaxyx,若有錯誤,請以斧正
謝謝閱讀!!!!!
總結
以上是生活随笔為你收集整理的动态爱心(C/C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java uploadify 参数_Up
- 下一篇: lg v35 thinkq刷韩版andr