700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言.表白神器.爱你之心之闪耀

C语言.表白神器.爱你之心之闪耀

时间:2023-10-26 06:18:31

相关推荐

C语言.表白神器.爱你之心之闪耀

前言

爱你之心之闪耀,这个名字比较沙雕哈哈哈。。。

爱你之心之闪耀

前言爱心函数的选取爱心函数1爱心函数2简单爱心 粒子发射原理爱心结构一些宏初始化init 创建若干爱心并初始化setHeart 展示爱心showHeart 爱心变大modifyHeart 设置音乐主函数Love.hLove.cpp祝有情人,终成眷属

C语言.爱你之心之闪耀

爱心函数的选取

Webdings和Webdings字符码对应表

字符Y就对应爱心,有兴趣的可以打印其它特殊字符。

爱心函数1

r = a*(1+sin(θ));

a控制爱心的大小

效果:

爱心函数2

效果:

需要说明的是上面都是极坐标公式,vs中是直角坐标系需要转换。

第二个爱心公式转后成直角坐标系时,y需要变成-y整个图形才能向上面一样。

未变成-y的图形:

还需要说明的是,第二个爱心极坐标公式转换后还需要乘上一个基础值才能使爱心放大。因为r(p)的取值范围使[0,1]

简单爱心

需要用到Easyx,不会的函数自己得查文档

EasyX

#define PI 3.1415926int main(){initgraph(600, 480);double r = 0;//0...1double angle = 0;int x = 0;int y = 0;int R = 80;//放大80倍settextcolor(RED);for (angle = 0; angle < PI * 2; angle += 0.1){r = sin(angle) * sqrt(fabs(cos(angle))) / (sin(angle) + sqrt(2)) - 2 * sin(angle) + 2;y = -R * r * sin(angle) + 300;x = R * r * cos(angle) + 300;settextstyle(10, 0, L"webdings");setbkmode(TRANSPARENT);//图案背景设置成透明的outtextxy(x + 20, y + 20, 'Y');//打印爱心}system("pause");closegraph();return 0;}

粒子发射原理

这里的height是下图函数中的参数,文字的高度,你可以理解为大小。

若干(我一开始设置的是20)个爱心一开始基础框架结构从R = 60, height = 10图(我设置的)开始,每次循环,R++,height++,结果小爱心变大,整体爱心向外延申(放大过程),当到R增加到一定程度爱心会消失。

还要明确爱心总共的个数设置多一点效果会好一些,我是这样设置:一开始初始化的爱心是20个,放大20次(R会增加20次),总共爱心为20*20。

整个结果是:所有被初始化过的爱心都在变大消失,变大消失…

在加上死循环,效果就会像视频那样。

整体思路就是上述的粒子发射原理。你可以像我一样设置音乐,下面也会讲。

爱心结构

typedef struct Love{int x;//x,y即极坐标转换后的坐标int y;//x,y为什么是int,因为outtextxy()函数是intint height;//爱心的高度double r;//极坐标中的rdouble angle;//极坐标的角度int R;//爱心图形的基础大小。}Love;extern Love loves[HEARTNUMS * BIGGERTIMES];//总共的爱心,是一个全局变量

一些宏

涉及到数字的大部分我都设置成了宏

#define PI 3.1415926 #define HEARTNUMS 20 //刚开始初始化爱心的个数#define BIGGERTIMES 20 //放大的次数#define TRUE_R 60 //基础值,即扩大的倍数

初始化

init

void init(){initgraph(640, 480);//窗口大小srand((unsigned int)time(NULL));//随机种子memset(loves, 0, sizeof(loves));//所有爱心中的所有变量初始化为0}

创建若干爱心并初始化

setHeart

//设置随机的角度void getRandAg(Love loves[]){for (int i = 0; i < HEARTNUMS; i++){//随机值只能取整 angle [0,2*PI] 因为sin、cos周期性变化所以取模1000没事int angle = rand() % 314 * 2 * 2;loves[i].angle = angle * 0.01;//避免爱心角度一样for (int j = 0; j <= i; j++){while (loves[j].angle == loves[i].angle){int angle = rand() % 1000;loves[i].angle = angle * 0.01;}}}}//函数功能,随机设置 HEARTSNUM 个爱心void setHeart(){int k = 0;//找到没有设置的爱心for (k = 0; k < HEARTNUMS * BIGGERTIMES && loves[k].R > 0; k++);getRandAg(&loves[k]);//得到随机的角度for (int i = k; i < k + HEARTNUMS; i++){loves[i].height = 0;//刚开始爱心的高度为0loves[i].R = TRUE_R;loves[i].r = sin(loves[i].angle) * sqrt(fabs(cos(loves[i].angle))) / (sin(loves[i].angle) + sqrt(2)) -2 * sin(loves[i].angle) + 2;//极坐标公式loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;// 80 ,300是偏移量,使爱心放到适当的位置loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;}}

展示爱心

展示的是所有被初始化过的爱心(R > 0)

showHeart

void showHeart(){//BeginBatchDraw()、EndBatchDraw()批量绘制图片需要使用的函数BeginBatchDraw();cleardevice();//清空屏幕settextcolor(RED);//设置颜色//for (int i = k; i < k + HEARTNUMS; i++)for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++){if (loves[i].R == 0)continue;//设置字体样式settextstyle(loves[i].height + 10, 0, L"webdings");setbkmode(TRANSPARENT);//图案设置成透明的outtextxy(loves[i].x + 20, loves[i].y + 20, 'Y');//打印爱心}EndBatchDraw();}

爱心变大

所有被初始化过的爱心变大

modifyHeart

void modifyHeart(){for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++){if (loves[i].R == 0)continue;loves[i].R++;if (loves[i].R > TRUE_R + BIGGERTIMES){memset(&loves[i], 0, sizeof(Love));}loves[i].height++;loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;}}

设置音乐

要用的头文件、预处理指令

#include<mmsystem.h>#pragma comment(lib,"winmm.lib")

两个函数open打开音乐play播放,./music.mp3./这个意思是当前路径下,music.mp3是音乐的名字和后缀。""前要加上L,是字符集的原因

mciSendString(L"open ./music.mp3", 0, 0, 0);mciSendString(L"play ./music.mp3 repeat", 0, 0, 0);

音乐的格式一定要是mp3格式的,可以去QQ音乐下载。放在哪看下面图片

你只要看你的Love.cpp即源文件在哪,你的音乐就放在哪。

主函数

int main(){init();//初识化设置while (1){setHeart();//初始设置爱心showHeart();//绘制爱心modifyHeart();//爱心闪耀(修改)mciSendString(L"open ./music.mp3", 0, 0, 0);mciSendString(L"play ./music.mp3 repeat", 0, 0, 0);Sleep(30);//等待30毫秒}closegraph();return 0;}

Love.h

#pragma once#include <graphics.h>#include<math.h>#include<time.h>#include<stdlib.h>#include<mmsystem.h>#pragma comment(lib,"winmm.lib")#define PI 3.1415926 #define HEARTNUMS 20 //刚开始初始化爱心的个数#define BIGGERTIMES 20 //放大的次数#define TRUE_R 60 //基础值,即扩大的倍数typedef struct Love{int x;int y;int height;//爱心的高度double r;//极坐标中的rdouble angle;//极坐标的角度int R;//爱心图形的基础大小。}Love;extern Love loves[HEARTNUMS * BIGGERTIMES];

Love.cpp

#include"Love.h"Love loves[HEARTNUMS * BIGGERTIMES];void init(){initgraph(640, 480);srand((unsigned int)time(NULL));memset(loves, 0, sizeof(loves));}void getRandAg(Love loves[]){for (int i = 0; i < HEARTNUMS; i++){//设置随机的爱心//随机值只能取整 angle 0~PI 因为sin、cos周期性变化所以取模1000没事int angle = rand() % 314 * 2 * 2;loves[i].angle = angle * 0.01;//避免爱心角度一样for (int j = 0; j < i; j++){while (loves[j].angle == loves[i].angle){int angle = rand() % 1000;loves[i].angle = angle * 0.01;}}}}//函数功能,随机设置 HEARTSNUM 个爱心void setHeart(){int k = 0;//找到没有设置的爱心for (k = 0; k < HEARTNUMS * BIGGERTIMES && loves[k].R > 0; k++);getRandAg(&loves[k]);//得到随机的角度for (int i = k; i < k + HEARTNUMS; i++){loves[i].height = 0;//刚开始爱心的高度为0loves[i].R = TRUE_R;loves[i].r = sin(loves[i].angle) * sqrt(fabs(cos(loves[i].angle))) / (sin(loves[i].angle) + sqrt(2)) -2 * sin(loves[i].angle) + 2;loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;}}void showHeart(){BeginBatchDraw();cleardevice();//清空屏幕settextcolor(RED);//for (int i = k; i < k + HEARTNUMS; i++)for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++){if (loves[i].R == 0)continue;//设置字体样式settextstyle(loves[i].height + 10, 0, L"webdings");setbkmode(TRANSPARENT);//图形设置成透明的outtextxy(loves[i].x + 20, loves[i].y + 20, 'Y');//打印爱心}EndBatchDraw();}void modifyHeart(){for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++){if (loves[i].R == 0)continue;loves[i].R++;if (loves[i].R > TRUE_R + BIGGERTIMES){memset(&loves[i], 0, sizeof(Love));}loves[i].height++;loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;}}int main(){init();//初识化设置while (1){setHeart();//初始设置爱心showHeart();//绘制爱心modifyHeart();//爱心变大mciSendString(L"open ./music.mp3", 0, 0, 0);mciSendString(L"play ./music.mp3 repeat", 0, 0, 0);Sleep(30);//等待30毫秒}closegraph();return 0;}

祝有情人,终成眷属

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。