C/C++跳动的爱心②

作者:Want595日期:2025/11/26

写在前面

这是一段使用C语言编写的控制台程序,用于在Windows命令行中动态绘制一颗跳动的爱心。通过数学函数建模与字符渲染技术,程序模拟了三维爱心的形状,并使其具有动态效果。整个过程融合了数学建模、图形渲染和控制台操作技术,展现了如何在有限的控制台环境中实现复杂的视觉表现。

系列文章

序号直达链接
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++哆啦A梦
15C/C++简单圣诞树
16C/C++小宇宙
17C/C++冰墩墩
18C/C++七彩花朵
19C/C++玫瑰花
20C/C++小猪佩奇
21C/C++简易爱心
22C/C++流星雨①
23C/C++2048小游戏
24C/C++爱心圣诞树
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++炫酷烟花③
38C/C++炫酷烟花④
39C/C++星空漩涡
40C/C++流星雨②
敬请期待……

技术需求

  1. 数学建模与几何表达
  • 隐函数定义:使用自定义函数f(x, y, z)描述爱心的三维几何形状,通过复杂的多项式运算实现非线性曲面建模。
  • 高度场计算:通过函数h(x, z)计算爱心表面在特定x、z坐标下的y值,用于生成三维表面的投影信息。
  1. 控制台图形渲染
  • 字符灰度映射:使用字符集.:-=+*#%@表示不同的亮度等级,通过法向量计算得到的光照强度映射到字符上,实现三维效果。
  • 缓冲区绘制:使用二维字符数组作为绘制缓冲区,先在内存中完成整帧图像的构建,再一次性输出到控制台,避免画面闪烁。
  1. 系统级控制台操作
  • 窗口居中显示:通过Windows API获取屏幕分辨率和窗口尺寸,计算并设置控制台窗口的位置,使其居中显示,提升用户体验。
  • 颜色与窗口设置:使用system函数设置控制台背景色和窗口尺寸,优化视觉呈现效果。
  1. 动态效果实现
  • 时间参数驱动:通过主循环中的时间变量t驱动爱心的变形,利用三角函数生成周期性变化的比例因子,实现跳动效果。
  • 实时渲染与刷新:在循环中不断重新计算并渲染每一帧图像,通过Sleep函数控制帧率,保持动画流畅性。
  1. 光照与视觉增强
  • 法向量与光照计算:通过数值微分方法计算爱心表面的法向量,结合光照模型计算每个点的亮度值,增强立体感。
  • 视角变换:根据时间参数动态调整x、z坐标的缩放比例,模拟视角变化,增强动态效果。

主要代码

创作不易,订阅后可查看完整代码

1#include <stdio.h>
2#include <math.h>
3#include <windows.h>
4#include <tchar.h>
5 
6float f(float x, float y, float z) {
7	float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
8	return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
9}
10 
11float h(float x, float z) {
12	for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
13		if (f(x, y, z) <= 0.0f)
14			return y;
15	return 0.0f;
16}
17 
18int main() {
19	system("color fc"); //设计程序颜色
20	system("mode con cols=60 lines=28");  //设计控制台大小
21	HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);
22	_TCHAR buffer[25][80] = { _T(' ') };
23	_TCHAR ramp[] = _T(".:-=+*#%@");
24 
25	HWND consoleHandle = GetConsoleWindow();
26 
27	// 获取系统屏幕分辨率
28	int screenWidth = GetSystemMetrics(SM_CXSCREEN);
29	int screenHeight = GetSystemMetrics(SM_CYSCREEN);
30 
31	// 获取窗口大小
32	RECT consoleRect;
33	GetWindowRect(consoleHandle, &consoleRect);
34	int consoleWidth = consoleRect.right - consoleRect.left;
35	int consoleHeight = consoleRect.bottom - consoleRect.top;
36 
37	// 计算窗口应该出现的位置
38	int x = (screenWidth - consoleWidth) / 2;
39	int y = (screenHeight - consoleHeight) / 2;
40 
41	// 使用SetWindowPos函数设置新的窗口位置
42	SetWindowPos(consoleHandle, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
43 
44……
45
46

创作流程

在创作这段代码时,我的初衷是用最朴素的控制台环境展现一个生动的爱心形象。这个想法源于对数学之美的敬畏和对编程艺术的热爱。我想要挑战在没有图形库支持的条件下,如何用字符和数学公式构建出具有生命力的视觉作品。

首先,我需要一个数学模型来描述爱心的形状。经过一番思考,我选择了一个经典的三维隐函数来表达爱心的几何结构。这个函数包含了复杂的多项式运算,能够生成一个具有心形轮廓的三维曲面。为了让这个曲面能够在二维屏幕上呈现,我设计了函数h(x, z)来计算每个(x, z)坐标对应的y值,这实际上是在构建一个高度场。

在渲染方面,我决定使用字符画的方式。我精心挑选了一组从暗到亮的字符,构成一个灰度渐变序列。为了让爱心看起来更立体,我引入了光照模型。通过计算每个点的法向量,并结合光源方向,我可以得到该点的亮度值,然后映射到字符灰度序列上。这种做法让爱心表面具有了明暗变化,增强了立体感。

为了实现动态效果,我在主循环中引入了时间参数。通过正弦函数生成周期性变化的比例因子,我可以让爱心在一定范围内收缩和膨胀,模拟跳动的效果。同时,我还根据时间参数调整了视角,让爱心在跳动的同时还带有一点旋转的感觉,使动画更加生动。

在控制台操作方面,我希望程序运行时能给用户带来更好的体验。因此,我对控制台窗口进行了定制,包括设置背景颜色、调整窗口大小,并将窗口居中显示在屏幕中央。这些细节处理虽然不复杂,但却能让整个作品显得更加专业和精致。

整个创作过程中,我不断地在数学精度和程序性能之间寻找平衡。比如在计算高度场时,我需要在精度和速度之间做出权衡,最终选择了合适的步长。在字符渲染时,我也考虑了字符的密度和视觉效果,选择了最能表现灰度变化的字符组合。

当我第一次看到控制台中那颗跳动的爱心时,内心充满了成就感。这不仅是一个技术实现,更是一种情感的表达。在这个由代码和数学构建的世界里,我找到了技术与艺术的完美结合点。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


C/C++跳动的爱心②》 是转载文章,点击查看原文


相关推荐


经典粒子群优化算法PSO-LSTM回归+SHAP分析+多输出+新数据预测!Matlab代码实现
机器学习之心2025/11/24

经典粒子群优化算法PSO-LSTM回归+SHAP分析+多输出+新数据预测!Matlab代码实现,主要用于多输入多输出的回归预测任务。以下是详细分析: 1. 主要功能 智能优化LSTM超参数:使用PSO算法优化LSTM的隐藏层神经元数和初始学习率多输出回归预测:支持多个输出变量的同时预测模型性能对比:比较优化前后LSTM模型的预测精度可视化分析:提供丰富的图表展示预测结果和性能指标特征重要性分析:计算SHAP值分析特征贡献度 2. 算法步骤 1. 数据预处理 → 2. PSO超参数优化 → 3.


claude code 的安装方法
意疏2025/11/23

我来介绍一下克劳德code的安装方式: 提示:这篇文章适合有一点点基础的同学,没有基础勿看! 首先我们需要安装一下node 这里我之前安装过 不在介绍。 我们输入: node --version npm --version 之后需要安装git : 我之前的链接:git的安装 这里如果调用命令行来运行git显示不成功的话 那么就代表没有配置环境变量 我们需要配置环境变量 首先我的git在E盘(节省空间) 我们点击环境变量 ➡️ 用户变量 ➡️ PATH


对 .NET FileSystemWatcher引发内存碎片化的 反思
用户7227868123442025/11/21

1. 讲故事 前些天又遇到了一例 FileSystemWatcher 引发的内存碎片化故障,但这个碎片化不是因为经典的 reloadOnChange=true 导致的,所以我觉得有必要做一次深度的反思,供以后遇到类似问题提供技术上的解决方法,这篇我们就来系统的讲解下 两种碎片化方式的调查方法。 二:经典的 FileSystemWatcher 碎片化 1. 测试代码 这种碎片化是由 reloadOnChange=true 引发的,祸根主要是程序员将 .netframework 读取配置文件的方式套


从 Flink 到 Doris 的实时数据写入实践——基于 Flink CDC 构建更实时高效的数据集成链路
SelectDB2025/11/19

Flink-Doris-Connector 作为 Apache Flink 与 Doris 之间的桥梁,打通了实时数据同步、维表关联与高效写入的关键链路。本文将深入解析 Flink-Doris-Connector 三大典型场景中的设计与实现,并结合 Flink CDC 详细介绍了整库同步的解决方案,助力构建更加高效、稳定的实时数据处理体系。 一、Apache Doris 简介 Apache Doris 是一款基于 MPP 架构的高性能、实时的分析型数据库,整体架构精简,只有 FE 、BE 两个系


Vue 3.0 源码解读
艾光远2025/11/18

1. 工程架构设计 Vue 3 是一个现代化的前端框架,采用模块化设计,源码项目被划分为多个模块,每个模块负责不同的功能。 1.1. compiler-core compiler-core 是 Vue 3 的编译核心模块,主要负责将模板转换为渲染函数。其模块如下: Parser(解析器):将模板字符串解析成抽象语法树(AST)。 Transform(转换器):遍历 AST,进行必要的转换,比如处理指令、插值、事件等。 Codegen(代码生成器):将转换后的 AST 转换成 Jav


用 Rust 构建 Git 提交历史可视化工具
掘金者阿豪2025/11/17

在软件开发中,版本控制系统的历史记录往往承载着项目的演进脉络。然而,当项目规模扩大、分支增多时,纯文本的 git log 输出很难直观地展现提交之间的复杂关系。今天,我想分享一个用 Rust 构建的轻量级工具 —— git-graph-rs,它能把 Git 仓库的提交历史转换为可视化的图结构,为代码审查、项目复盘和工程决策提供直观的支持。 @TOC 为什么需要可视化? 在参与大型项目时,我经常会遇到这样的场景: 需要快速了解某个功能分支的合并路径 在代码审查时想知道某个提交在整体历史中的位置


Python 的内置函数 oct
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 oct Python 的内置函数 oct() 用于将一个整数转换为八进制(以 8 为基数)字符串表示形式。该函数返回的字符串以 0o 为前缀,表示这是一个八进制数。 语法 oct(x) 参数 x:必须是一个整数(可以是十进制、二进制、十六进制或其他形式的整数)。如果 x 不是整数,则需要先实现 __index__() 方法返回一个整数。 返回值 返回一个以 0o 为前缀的八进制字符串。 示例 十进制转八进制 prin


【大模型】重磅升级!文心 ERNIE-5.0 新一代原生全模态大模型,这你都不认可它吗?!
南方者2025/11/14

🧩 前言速读 11 月 13 日,2025百度世界大会上,新一代「原生全模态」大模型文心 5.0 正式亮相,2.4 万亿参数量,采用原生全模态统一建模技术,具备全模态理解与生成能力,支持「文本、图像、音频、视频」等多种信息的输入与输出,将国内大模型竞争力推向全球顶尖水准。 大会上强调:“智能本身是最大的应用,技术迭代速度是唯一的护城河”,而文心 5.0 正是这一理念的最新实践 —— 它不仅是参数规模的跃升,更标志着 AI 从 “单模态处理” 迈入 “原生多模态融合” 的新阶段。 接下来,让


OpenCVSharp:ArUco 标记检测与透视变换
mingupup2025/11/13

前言 对于.NET开发者而言,入门OpenCV的一个很舒适的方式就是先去使用OpenCVSharp,它是 OpenCV 的 .NET 封装,而且作者还开源了一个示例库,可以通过示例库进行入门学习。 OpenCVSharp仓库地址:github.com/shimat/open… opencvsharp_samples仓库地址:github.com/shimat/open… 作者提供了几十个可以直接运行的示例代码,一开始可以先大概运行一下这些示例,看一下用这个库可以实现哪些功能。 入门第一步就是


🚀 MateChat发布V1.10.0版本,支持附件上传及体验问题修复,欢迎体验~
2025/11/12

✨ 本期亮点 最新发布的 MateChat V1.10.0 版本新增文件列表组件和重新生成功能等特性,希望这个版本为你带来全新的体验! 🎯 核心功能升级(新特性) 🔄 新增文件列表组件 1、基本用法 McFileList 组件的核心功能是接收一个文件对象数组,并将它们渲染为信息卡片。通过 fileItems 属性传入数据,并可使用 context 属性控制其在不同场景下的外观,详情点击文件列表组件Demo 2、不同上下文与状态 McFileList 提供了两种上下文模式和多种文件状态,以适

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读