系列文章
序号 | 直达链接 |
1 | C/C++爱心代码 |
2 | C/C++跳动的爱心 |
3 | C/C++李峋同款跳动的爱心代码 |
4 | C/C++满屏飘字表白代码 |
5 | C/C++大雪纷飞代码 |
6 | C/C++烟花代码 |
7 | C/C++黑客帝国同款字母雨 |
8 | C/C++樱花树代码 |
9 | C/C++奥特曼代码 |
10 | C/C++精美圣诞树 |
11 | C/C++俄罗斯方块 |
12 | C/C++贪吃蛇 |
13 | C/C++孤单又灿烂的神-鬼怪 |
14 | C/C++闪烁的爱心 |
15 | C/C++哆啦A梦 |
16 | C/C++简单圣诞树 |
17 | C/C++小宇宙 |
18 | C/C++冰墩墩 |
19 | C/C++七彩花朵 |
20 | C/C++玫瑰花 |
21 | C/C++小猪佩奇 |
写在前面
C/C++语言绘制一颗红色爱心的完整代码。
完整代码
#include <iostream>
#include <cmath>
#include <windows.h> // 用于 Windows API 绘图
// 绘制心形的函数
void drawHeart(HDC hdc, int centerX, int centerY, int size) {
for (int i = 0; i < 360; i++) {
double angle = i * 3.14159 / 180;
int x = static_cast<int>(size * 16 * pow(sin(angle), 3)) + centerX;
int y = static_cast<int>(-size * (13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - cos(4 * angle))) + centerY;
SetPixel(hdc, x, y, RGB(255, 0, 0)); // 绘制红色像素点
}
}
int main() {
int centerX = 400, centerY = 300, size = 15;
// 获取控制台窗口的句柄并创建绘图设备上下文
HWND consoleWindow = GetConsoleWindow();
HDC hdc = GetDC(consoleWindow);
// 绘制心形
drawHeart(hdc, centerX, centerY, size);
// 等待用户按键
std::cout << "Press any key to exit...";
std::cin.get();
// 释放设备上下文
ReleaseDC(consoleWindow, hdc);
return 0;
}
代码分析
这段代码是用C++编写的一个小程序,通过Windows API实现了在控制台窗口上绘制一个心形图案。以下是对该代码的详细分析:
1. 代码结构概述
代码的主要部分包括:
-
drawHeart
函数:核心绘图逻辑,用于计算心形曲线上的点并绘制出来。 -
main
函数:负责调用绘图函数,完成绘图环境的设置和释放。
代码通过调用 Windows API 的 SetPixel
函数在控制台窗口上绘制像素点,将数学曲线转化为可见的心形图案。
2. 引用的头文件
#include <iostream>
#include <cmath>
#include <windows.h>
-
<iostream>
:提供输入输出功能,如std::cout
和std::cin
。 -
<cmath>
:用于数学计算,例如pow
(求幂)、sin
(正弦)、cos
(余弦)。 -
<windows.h>
:提供Windows API的声明,如图形绘制函数SetPixel
、获取窗口句柄的GetConsoleWindow
等。
3. 绘制心形的数学原理
在 drawHeart
函数中,心形的绘制基于参数方程:
-
心形的参数方程:
-
( x = 16 \sin^3(t) )
-
( y = 13 \cos(t) - 5 \cos(2t) - 2 \cos(3t) - \cos(4t) )
其中,( t ) 为角度参数,以弧度为单位,范围是从 ( 0 ) 到 ( 2\pi )。
-
-
调整和比例:
- 为了适应窗口坐标系的绘制,这里进行了如下变换:
-
( x ):加上中心点横坐标
centerX
,将心形移动到窗口中心。 -
( y ):加上中心点纵坐标
centerY
,并取负值实现正确的坐标翻转(屏幕坐标系中y轴向下,而数学坐标系中y轴向上)。
-
- 为了适应窗口坐标系的绘制,这里进行了如下变换:
-
绘制像素点:
-
使用
SetPixel
函数将每个计算出的坐标点绘制成红色像素。
-
代码片段如下:
double angle = i * 3.14159 / 180; // 角度转弧度
int x = static_cast<int>(size * 16 * pow(sin(angle), 3)) + centerX;
int y = static_cast<int>(-size * (13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - cos(4 * angle))) + centerY;
SetPixel(hdc, x, y, RGB(255, 0, 0));
4. Windows API 的使用
(1) 获取控制台窗口句柄
HWND consoleWindow = GetConsoleWindow();
-
GetConsoleWindow
:获取当前控制台窗口的句柄(一个唯一标识窗口的值)。
(2) 创建绘图设备上下文
HDC hdc = GetDC(consoleWindow);
-
GetDC
:从指定的窗口句柄中获取设备上下文(HDC
),用于绘图操作。
(3) 绘制像素点
SetPixel(hdc, x, y, RGB(255, 0, 0));
SetPixel
:在指定位置(x, y)
上绘制一个指定颜色的像素点。-
第一个参数:设备上下文。
-
第二、三个参数:像素点的横纵坐标。
-
第四个参数:像素点的颜色(RGB值)。
-
(4) 释放设备上下文
ReleaseDC(consoleWindow, hdc);
-
绘图完成后释放设备上下文,避免资源泄漏。
5. 函数设计
(1) drawHeart
函数
- 参数:
-
hdc
:绘图设备上下文。 -
centerX
和centerY
:心形中心的坐标。 -
size
:心形的缩放系数。
-
- 功能:
-
遍历360个角度(以1度为步长),计算每个角度对应的心形曲线上点的坐标。
-
使用
SetPixel
绘制这些点。
-
(2) main
函数
- 设置绘图环境:
-
定义心形中心点和缩放大小。
-
获取控制台窗口句柄和设备上下文。
-
-
调用
drawHeart
绘制心形。 -
等待用户输入按键后结束程序。
6. 代码的优点
- 逻辑清晰:
-
函数化设计,绘图逻辑封装在
drawHeart
中,易于维护和扩展。
-
- 实现简单:
-
使用基本的数学公式和 Windows API 函数完成绘图任务,代码简洁明了。
-
- 交互性好:
-
使用控制台等待用户按键,方便查看绘制结果。
-
7. 总结
这段代码通过数学和编程的结合,将心形参数方程转换为图形化的结果,充分展示了数学在计算机图形学中的应用。代码逻辑清晰,适合用作学习Windows API图形编程的入门示例。但由于其绘图环境的限制以及跨平台问题,仍有进一步优化和扩展的空间。
写在后面
我是一只有趣的兔子,感谢你的喜欢!