C/C++绘制爱心

devtools/2024/11/29 21:30:29/

系列文章

序号直达链接
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++闪烁的爱心
15C/C++哆啦A梦
16C/C++简单圣诞树
17C/C++小宇宙
18C/C++冰墩墩
19C/C++七彩花朵
20C/C++玫瑰花
21C/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 函数中,心形的绘制基于参数方程:

  1. 心形的参数方程

    • ( x = 16 \sin^3(t) )

    • ( y = 13 \cos(t) - 5 \cos(2t) - 2 \cos(3t) - \cos(4t) )

    其中,( t ) 为角度参数,以弧度为单位,范围是从 ( 0 ) 到 ( 2\pi )。

  2. 调整和比例

    • 为了适应窗口坐标系的绘制,这里进行了如下变换:
      • ( x ):加上中心点横坐标 centerX,将心形移动到窗口中心。

      • ( y ):加上中心点纵坐标 centerY,并取负值实现正确的坐标翻转(屏幕坐标系中y轴向下,而数学坐标系中y轴向上)。

  3. 绘制像素点

    • 使用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. 代码的优点

  1. 逻辑清晰
    • 函数化设计,绘图逻辑封装在 drawHeart 中,易于维护和扩展。

  2. 实现简单
    • 使用基本的数学公式和 Windows API 函数完成绘图任务,代码简洁明了。

  3. 交互性好
    • 使用控制台等待用户按键,方便查看绘制结果。


7. 总结

这段代码通过数学和编程的结合,将心形参数方程转换为图形化的结果,充分展示了数学在计算机图形学中的应用。代码逻辑清晰,适合用作学习Windows API图形编程的入门示例。但由于其绘图环境的限制以及跨平台问题,仍有进一步优化和扩展的空间。

写在后面

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


http://www.ppmy.cn/devtools/138019.html

相关文章

漏洞管理与补丁管理详解:系统安全的基石

文章目录 漏洞管理与补丁管理详解&#xff1a;系统安全的基石什么是漏洞管理&#xff1f;什么是补丁管理&#xff1f;漏洞管理与补丁管理的联系与区别实施漏洞管理与补丁管理的最佳实践 漏洞管理与补丁管理详解&#xff1a;系统安全的基石 在网络安全的防护体系中&#xff0c;…

使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统

#LibreNMS 是一个功能强大的开源网络监控系统&#xff0c;它能够为你的网络性能和设备提供全面的监控。本文将引导你通过一系列步骤&#xff0c;在 Ubuntu 22.04 服务器上安装和配置 LibreNMS&#xff0c;使用 Nginx 作为 Web 服务器。 简介 LibreNMS 提供了对网络设备和性能…

使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』

使用NAS开启无纸化办公&#xff0c;Docker部署开源文档管理系统『Paperless-ngx』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于文案类的办公场景来说&#xff0c;手头堆放最多的可能就是各种文档文件&#xff0c;以及各种用过的打印废纸。 这么多年来&#xff0c;不管是领…

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…

CodeIgniter如何手动将模型连接到数据库

在CodeIgniter中&#xff0c;模型通常是自动与数据库连接的&#xff0c;因为模型类&#xff08;CI_Model&#xff09;已经内置了对数据库操作的支持。但是&#xff0c;如果你需要手动指定数据库连接或者进行一些特殊的数据库配置&#xff0c;你可以通过几种方式来实现。 1. 使…

ISIS SSN/SRM 标志在 P2P 链路和 Broadcast 链路中的作用

LSDB content 链路状态数据库内容 Each router maintains a separate LSDB for level-1 and level-2 LSPs 每个路由器为一级和二级 LSP 维护一个单独的 LSDB LSP headers and contents LSP 头部和内容 SRM Send Routeing Message SRM 发送路由消息 SSN Send Sequence Numbe…

建造者模式Builder——优雅的使用姿势

在面向对象设计中&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09; 是一种非常经典的设计模式&#xff0c;特别适用于需要构造复杂对象的场景。Lombok 提供的 Builder 注解极大简化了 Builder 模式的实现&#xff0c;而 toBuilder true 则进一步增强了它的灵活…

记录一次在生产环境中更换 SSL 证书的操作

本文将记录一次在生产环境中更换 SSL 证书的过程&#xff0c;包括准备工作、遇到的问题和解决方案&#xff0c;以及如何重启和重新加载 Nginx 服务以使更改生效。 1. 确认证书过期 SSL 证书通常具有有效期&#xff0c;当证书过期时&#xff0c;用户访问网站时会看到浏览器警告…