使用C语言EasyX 创建动态爱心背景

简介

在计算机图形学的世界中,有很多方法可以使程序的界面更加吸引人。在本篇博客中,我将向大家介绍如何使用 EasyX 图形库在 C++ 中创建一个动态的爱心背景。这不仅是一个简单的动画效果,它还包括背景的星星、旋转的心形以及一个美观的背景渐变。


工具介绍:EasyX 图形库

EasyX 是一个简单易用的 C++ 图形库,特别适合初学者和那些想要快速为其应用程序添加图形的开发者。它提供了一系列函数,可以帮助你绘制形状、设置颜色和实现动画效果。


设计目标

我们的目标是创建一个动态的爱心,它会在背景中旋转。背景将有一个从深空蓝渐变到黑色的效果,并散布有颜色各异的小星星。

图片展示


开始编码

定义星星的结构

每颗星星都有其坐标、颜色和亮度。我们使用一个 struct 来表示:

struct Star {int x, y;COLORREF color;float intensity;float intensityChange;
};

3.2 心形绘制函数

我们使用参数方程来绘制心形,并为它添加了旋转效果:

void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {BeginBatchDraw();  // 开始批量绘制const int thickness = 2;  // 调整这个值来改变心形的粗细for (float t = 0; t < 2 * 3.14159; t += 0.01) {float x_cord = scale * (16 * pow(sin(t), 3));float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));// 旋转float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);for (int dx = -thickness; dx <= thickness; dx++) {for (int dy = -thickness; dy <= thickness; dy++) {putpixel(x + rotatedX + dx, y + rotatedY + dy, color);}}}EndBatchDraw();  // 结束批量绘制,并显示在前台
}

主函数逻辑

main() 函数中,我们首先初始化 EasyX 的图形窗口。接着,我们随机生成一组星星,并存储它们的属性。在主循环中,我们绘制背景渐变、星星和心形,并实现心形的动态效果。


源代码分享

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <vector>struct Star {int x, y;COLORREF color;float intensity;float intensityChange;
};// 修改后的心形公式函数
void DrawHeart(int x, int y, COLORREF color, float scale, float angle) {BeginBatchDraw();  // 开始批量绘制const int thickness = 2;  // 调整这个值来改变心形的粗细for (float t = 0; t < 2 * 3.14159; t += 0.01) {float x_cord = scale * (16 * pow(sin(t), 3));float y_cord = scale * -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));// 旋转float rotatedX = x_cord * cos(angle) - y_cord * sin(angle);float rotatedY = x_cord * sin(angle) + y_cord * cos(angle);for (int dx = -thickness; dx <= thickness; dx++) {for (int dy = -thickness; dy <= thickness; dy++) {putpixel(x + rotatedX + dx, y + rotatedY + dy, color);}}}EndBatchDraw();  // 结束批量绘制,并显示在前台
}int main() {// 初始化图形窗口initgraph(640, 480);setbkcolor(BLACK); // 设置背景色为黑色cleardevice();     // 清空屏幕// 创建星星const int numStars = 100;std::vector<Star> stars;for (int i = 0; i < numStars; i++) {Star star = {rand() % 640,rand() % 480,RGB(rand() % 256, rand() % 256, rand() % 256),(rand() % 100) / 100.0f,(rand() % 5 + 1) / 500.0f};stars.push_back(star);}float scale = 10;bool increase = true;COLORREF heartColor = RED;float angle = 0;BeginBatchDraw();  // 开始批量绘制while (!_kbhit()) { // 直到有键被按下cleardevice(); // 清空屏幕// 绘制渐变背景for (int i = 0; i < 480; i++) {float ratio = (float)i / 480;COLORREF bgColor = RGB(0, 0, ratio * 50);setlinecolor(bgColor);line(0, i, 640, i);}// 绘制星星for (auto& star : stars) {star.intensity += star.intensityChange;if (star.intensity > 1 || star.intensity < 0.5) {star.intensityChange = -star.intensityChange;}COLORREF modifiedColor = RGB(GetRValue(star.color) * star.intensity, GetGValue(star.color) * star.intensity, GetBValue(star.color) * star.intensity);putpixel(star.x, star.y, modifiedColor);}if (increase) {scale += 0.1;}else {scale -= 0.1;}if (scale > 15 || scale < 10) {increase = !increase;}// 改变心的颜色int r = GetRValue(heartColor);int g = GetGValue(heartColor);int b = GetBValue(heartColor);r = (r + 1) % 256;g = (g + 2) % 256;b = (b + 3) % 256;heartColor = RGB(r, g, b);DrawHeart(320, 240, heartColor, scale, angle);angle += 0.005; // 调整这个值来改变旋转速度Sleep(10);EndBatchDraw();  // 结束批量绘制,并显示在前台}closegraph();return 0;
}

结果

当你运行上述代码时,你将看到一个美丽的动态背景,上面有一个不断旋转的爱心和一群闪烁的星星。通过调整参数,你可以轻松改变动画的速度、颜色和其他属性。


参考资源:

  1. EasyX 官方文档
  2. 心形参数方程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107210.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音中文点选验证码识别方案

最近研究了一下抖音中文点选验证码的识别&#xff0c;居然正确率高达98%。 首先我们来看一下效果 一、识别方法 1、数据集准备 我们需要借助爬虫去下载大量的验证码图片。这些有两种图片&#xff0c;一种是小图&#xff0c;包含需要点选的中文和顺序&#xff0c;还有一种是大…

Python基于Flask的高校舆情分析,舆情监控可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 运行效果图 基于Python的微博大数据舆情分析&#xff0c;舆论情感分析可视化系统 系统介绍 微博舆情分析系…

如何使用element-ui相关组件如:el-select,el-table,el-switch,el-pagination,el-dialog

element-ui 官方链接&#xff1a; 组件 | Elementhttps://element.eleme.cn/#/zh-CN/component/installation el-select <!-- 用户类型选择框<template> 看情况使用value选择框绑定的值 命名必须是value不能改v-for"item in Options" options数据源来自于…

【Unity基础】2.网格材质贴图与资源打包

【Unity基础】2.网格材质贴图与资源打包 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;网格材质纹理 第一次接触3D物体的话&#xff0c;会觉得好神奇啊&#xff0c;这个物体究竟是由什么组…

探索工业4.0:数字孪生如何重塑工业生产流程?

在过去的几十年里&#xff0c;工业生产经历了从机械化、自动化到数字化的巨大转变。随着工业4.0的到来&#xff0c;我们正处于第四次工业革命的边缘&#xff0c;这次革命将由数字孪生技术引领。本文将深入探讨数字孪生在工业生产中的应用和潜力。 数字孪生&#xff08;Digital …

【1++的C++进阶】之C++11(一)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;前言二&#xff0c;列表初始化三&#xff0c;声明自动类型推断&#xff08;auto&#xff09;decltypenullptr 四&#xff0c;右值引用五&#xff0c;完美转发…

Web学习笔记-React(组合Components)

笔记内容转载自 AcWing 的 Web 应用课讲义&#xff0c;课程链接&#xff1a;AcWing Web 应用课。 CONTENTS 1. 创建父组件2. 从上往下传递数据3. 传递子节点4. 从下往上调用函数5. 兄弟组件间传递消息6. 无状态函数组件7. 组件的生命周期 本节内容是组件与组件之间的组合&#…

如何判断一篇论文有没有被SCI收录?

打开 Web of Science 网站设置 SCI 筛选条件&#xff08;因为 WoS 收录的不只是 SCI&#xff09; 3. 输入论文题目&#xff0c;点击搜索

WavJourney:进入音频故事情节生成世界的旅程

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 若要正确查看音频生成的强大功能&#xff0c;请考虑以下方案。我们只需要提供一个简单的指令&#xff0c;描述场景和场景设置&#xff0c;模型就会生成一个扣人心弦的音频脚本&#xff0c;突出与原始指令的最高上下文相…

virtualbox 扩展磁盘大小

此处设置完成后&#xff0c;还需要进入虚拟机&#xff0c;实际扩展磁盘大小 参考 https://zhuanlan.zhihu.com/p/319431032

大数据课程K22——Spark的SparkSQL的API调用

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的通过api使用SparkSQL; 一、通过api使用SparkSQL 1. 实现步骤 1. 打开scala IDE开发环境,创建一个scala工程。 2. 导入spark相关依赖jar包。 3. 创建包路径以object类。 4.…

Ubutnu python2与python3切换

python -V #查看默认版本 Python 2.7.17 python3 -V #查看电脑3的版本 Python 3.6.9 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 #设置两个版本的…