C/C++樱花树代码

目录

写在前面

系列文章

C++简介

完整代码

代码分析

写在后面


写在前面

C++实现精美的樱花树,只需这100行代码!

系列文章

序号目录直达链接
1爱心代码https://want595.blog.csdn.net/article/details/136360684
2李峋同款跳动的爱心https://want595.blog.csdn.net/article/details/139722249
3满屏飘字代码https://want595.blog.csdn.net/article/details/136342476
4大雪纷飞代码
5新春烟花代码
6黑客帝国字母雨https://want595.blog.csdn.net/article/details/139923742
7樱花树https://want595.blog.csdn.net/article/details/140690893

C++简介

C++是一种通用编程语言,特点是高效、灵活、强大和可移植性强。它是从C语言发展而来的,但在语法和功能上有很多扩展和改进。C++支持面向对象编程,允许使用类和对象来封装数据和功能,并通过继承、多态等技术实现代码的重用和扩展性。与C语言相比,C++还引入了一些特性,如模板和异常处理,以提供更高级的编程能力。C++被广泛应用于系统开发、游戏开发、图形界面开发等领域。

完整代码

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <time.h>#define PI 3.1415926
#define WIDTH 800             
#define HEIGHT 600            float offsetAngle = PI / 6;
float shortenRate = 0.65;
int isShowAnimation = 1;float mapValue(float input, float inputMin, float inputMax, float outputMin, float outputMax) {return (input - inputMin) * (outputMax - outputMin) / (inputMax - inputMin) + outputMin;
}float randBetween(float min, float max) {return mapValue(rand() / (double)RAND_MAX, 0, 1, min, max);
}void drawBranch(float x_start, float y_start, float length, float angle, float thickness, int generation) {float x_end = x_start + length * cos(angle);float y_end = y_start + length * sin(angle);setlinestyle(PS_SOLID, (int)thickness);COLORREF color = HSVtoRGB(15, 0.75, 0.4 + generation * 0.05);setlinecolor(color);line(x_start, y_start, x_end, y_end);if (length < 2 || generation > 9) {setlinestyle(PS_SOLID, 1);color = HSVtoRGB(randBetween(300, 350), randBetween(0.2, 0.3), 1);setlinecolor(color);setfillcolor(color);fillcircle(x_end, y_end, length <= 4 ? 2 : length / 2);return;}float childLength = shortenRate * length;float childThickness = thickness * 0.8;childThickness = childThickness < 2 ? 2 : childThickness;int childGeneration = generation + 1;if (randBetween(0, 1) < 0.95)drawBranch(x_end, y_end, childLength * randBetween(0.9, 1.1), angle + offsetAngle * randBetween(0.5, 1), childThickness, childGeneration);if (randBetween(0, 1) < 0.95)drawBranch(x_end, y_end, childLength * randBetween(0.9, 1.1), angle - offsetAngle * randBetween(0.5, 1), childThickness, childGeneration);if (randBetween(0, 1) < 0.85)drawBranch(x_end, y_end, childLength * randBetween(0.8, 1.1), angle + offsetAngle / 5 * randBetween(-1, 1), childThickness, childGeneration);if (isShowAnimation) {FlushBatchDraw();Sleep(0);}
}void startup() {srand(time(0));initgraph(WIDTH, HEIGHT);setbkcolor(RGB(255, 192, 203));cleardevice();BeginBatchDraw();drawBranch(WIDTH / 2, HEIGHT, 0.45 * HEIGHT * shortenRate, -PI / 2, 15 * shortenRate, 1);FlushBatchDraw();
}void update() {ExMessage e;if (peekmessage(&e)) {if (e.message == WM_MOUSEMOVE) {offsetAngle = mapValue(e.x, 0, WIDTH, PI / 10, PI / 4);shortenRate = mapValue(e.y, 0, HEIGHT, 0.7, 0.3);}if (e.message == WM_LBUTTONDOWN) {cleardevice();drawBranch(WIDTH / 2, HEIGHT, 0.45 * HEIGHT * shortenRate, -PI / 2, 15 * shortenRate, 1);FlushBatchDraw();}if (e.message == WM_RBUTTONDOWN) {isShowAnimation = !isShowAnimation;}}
}int main() {startup();while (1) {update();}return 0;
}

代码分析

这段代码是一个利用图形库绘制樱花树的程序。它使用了C语言的图形库和一些数学函数来实现绘制效果。

主要函数

  1. `mapValue`函数用于将一个输入值映射到指定区间的输出值。
  2. `randBetween`函数用于生成一个指定范围内的随机数。
  3. `drawBranch`函数用于绘制樱花树的一条分支。
  4. `startup`函数用于初始化绘图环境和绘制初始的樱花树。
  5. `update`函数用于根据用户的鼠标操作更新樱花树的参数。

代码中定义了一些常量和参数,如PI表示圆周率,WIDTH和HEIGHT表示窗口的宽度和高度,offsetAngle表示分支的偏移角度,shortenRate表示分支的缩短比例,isShowAnimation表示是否展示动画效果。

代码中还使用了一些辅助函数,如mapValue函数用于将一个值从一个范围映射到另一个范围,randBetween函数用于生成一个指定范围内的随机数。

drawBranch函数是绘制樱花树的核心函数,它使用递归的方式绘制树的各个分支。参数x_start和y_start表示起始点的坐标,length表示分支的长度,angle表示分支的角度,thickness表示分支的粗细,generation表示分支的代数。通过计算得到分支的终点坐标,并根据参数设置绘制直线,并根据长度和代数判断是否绘制叶子。

在drawBranch函数中,还使用了三次递归调用来绘制下一级的分支,每次绘制分支时,根据随机数和参数设置分支的长度、角度和粗细。同时,drawBranch函数还可以根据全局变量isShowAnimation来控制是否展示动画效果。

startup函数是程序的初始化函数,其中调用了initgraph函数初始化图形窗口,并进行一些初始化设置,如设置背景色、清空画面、开启批量绘制模式。然后调用drawBranch函数绘制主干分支,并刷新屏幕。

update函数是程序的更新函数,通过调用peekmessage函数来获取鼠标事件,根据不同的事件来更新樱花树的参数或重新绘制树。其中,鼠标移动事件会改变offsetAngle和shortenRate的值,左键点击事件会重新绘制树,右键点击事件会切换是否展示动画效果。

main函数是程序的入口函数,其中调用了startup函数进行初始化,然后进入一个无限循环中,不断调用update函数来更新程序的状态。

写在后面

我是一只可爱的兔子,感谢你的喜欢!

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

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

相关文章

MySQL的高可用(MHA)

高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要三台。 故障切换过程0-30秒 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先级确定的&#xff0c;主从复制的时候就确定…

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

python使用rich.progress打印彩色进度条

常规的同步方法和for循环的进度&#xff0c;使用tqdm能很直观地展示进度&#xff1b;而一些异步协程或难以预估进度的&#xff0c;可以考虑使用rich.progress Ref: https://typer.tiangolo.com/tutorial/progressbar/#progress-bar 案例一&#xff1a;左侧展示旋转的小圈圈 …

设计模式SOLID原则

在Java编程中&#xff0c;SOLID原则是一组被广泛接受和应用的面向对象设计原则&#xff0c;旨在提高软件设计的灵活性、可维护性和可扩展性。这五个原则分别是&#xff1a; 1. 单一责任原则&#xff08;Single Responsibility Principle, SRP&#xff09; 定义&#xff1a;一…

机器学习(二十):偏差和方差问题

一、判断偏差和方差 以多项式回归为例&#xff0c;红点为训练集数据&#xff0c;绿点为交叉验证数据。 下图的模型&#xff0c;训练集误差大&#xff0c;交叉验证集误差大&#xff0c;这代表偏差很大 下图的模型&#xff0c;训练集误差小&#xff0c;交叉验证集误差小&#x…

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

外卖霸王餐系统架构怎么选?

在当今日益繁荣的外卖市场中&#xff0c;外卖霸王餐作为一种独特的营销策略&#xff0c;受到了众多商家的青睐。然而&#xff0c;要想成功实施外卖霸王餐活动&#xff0c;一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择&#xff0c;以期为商家提…

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好&#xff0c;我是画画的小强 在 7 月初的一次更新中&#xff0c;ComfyUI 官方推出了 Beta 版 UI&#xff0c;取消了原本的悬浮面板&#xff0c;还新增了工作流管理功能&#xff0c;整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

iOS中的MVVM设计模式

目录 前言 一、MVVM简介 二、MVVM的核心思想 三、MVVM的优势 四、MVVM在iOS中的实现 1. 创建Model 2. 创建ViewModel 3. 创建View 4. 主入口 总结 前言 随着iOS开发的发展&#xff0c;构建可维护和可扩展的代码架构变得至关重要。Model-View-ViewModel (MVVM) 是一种…

【STM32】超声波一般常用哪两个引脚?

在STM32单片机中&#xff0c;超声波模块HC-SR04通常使用PA6和PA7引脚进行驱动。 在STM32单片机上使用HC-SR04超声波模块时&#xff0c;常用的引脚是PA6和PA7。其中&#xff0c;PA6用于发送触发信号到Trig引脚&#xff0c;而PA7用于接收Echo引脚的回响信号。这两个引脚通过适当的…

pdf2image:将PDF文档转化为图像的Python魔法

标题&#xff1a;探索pdf2image&#xff1a;将PDF文档转化为图 像的Python魔法 背景 在数字时代&#xff0c;我们经常需要处理各种格式的文档&#xff0c;尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而&#xff0c;有时我们需要将PDF文件转换成图像格式&am…

springboot3-web-questions-分析

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、问题案例 1、maven项目compile时候出现告警warn 2、java文件打包然后在命令行中运行java会找不到主类 3、程序找不到数据库驱动和配置实例 4、springboot和mybatis-plus版本不兼容导致 5、springboot项目启动的解释…

sklearn中的增量学习:特征提取的艺术

sklearn中的增量学习&#xff1a;特征提取的艺术 在机器学习领域&#xff0c;特征提取是构建有效模型的关键步骤。然而&#xff0c;并非所有数据集都适合一次性加载到内存中进行处理&#xff0c;尤其是在处理大规模数据集时。Scikit-learn&#xff08;sklearn&#xff09;提供…

21、Python之面向对象:一切皆对象,可你真的需要面向对象吗

引言 面向对象&#xff08;Object-Oriented Programming, OOP&#xff09;和面向过程&#xff08;Procedural Programming&#xff09;是两种不同的编程范式。不能因为我们接下来要进入“面向对象”的模块的学习&#xff0c;就武断地说&#xff0c;面向对象一定比面向过程好。…

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 &#xff0c;图片合并及保存需要另做处理&#xff01;&#xff01; 目标&#xff1a;Excel合并行内容的导入 结果&#xff1a; 1. ExcelUtil.java 类&#xff0c;新增方法&#xff1a;判断是否是合并行 /*** 新增 合并行相关代码&#xff1a;…

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

计网_数据通信基础知识

2024.07.05&#xff1a;计算机网络数据通信基础知识学习笔记 第2节 数据通信基础知识 2.1 物理层特性&#xff08;学会区分&#xff09;2.2 信道相关的基本概念2.2.1 数字信号的&#xff08;基带调制&#xff09;&#xff08;1&#xff09;不归零NRZ编码&#xff08;2&#xff…

大模型日报 2024-07-25

大模型日报 2024-07-25 大模型资讯 Meta发布开源AI模型Llama 3.1 405B 摘要: Meta于周二宣布推出Llama 3.1 405B&#xff0c;这是一款大型语言模型&#xff0c;旨在与Anthropic、谷歌和OpenAI的顶级模型竞争。 Meta发布全球最大AI模型Llama 3.1 405B 摘要: Meta今日发布了其迄今…

在Typescript + Pinia 中使用 Actions

文件准备 type.ts import type { PiniaCustomProperties, StateTree, StoreDefinition, _GettersTree, _StoreWithGetters, _StoreWithState } from pinia; import type { UnwrapRef } from vue;/**构建 Actions */ type CreateActions<Id extends string, S extends StateT…

1207. 有趣的数字图形IV

问题描述 输入一个整数 &#x1d45b; &#xff08; &#x1d45b;≤12 &#xff09;&#xff0c;打印出如下要求的方阵&#xff1a; 除掉右上到左下对角线上的数外的右下半个区域中每个元素等于左边的和上面的元素之和。每个元素场宽为 5 。左上半个区域为空。 输入 一个整…