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语言的图形库和一些数学函数来实现绘制效果。
主要函数
- `mapValue`函数用于将一个输入值映射到指定区间的输出值。
- `randBetween`函数用于生成一个指定范围内的随机数。
- `drawBranch`函数用于绘制樱花树的一条分支。
- `startup`函数用于初始化绘图环境和绘制初始的樱花树。
- `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函数来更新程序的状态。
写在后面
我是一只可爱的兔子,感谢你的喜欢!
相关文章:
C/C++樱花树代码
目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树,只需这100行代码! 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…...
sklearn基础学习
1. 简介 1.1 什么是sklearn sklearn,或者更正式地称为scikit-learn,是一个基于Python的开源机器学习库。它建立在NumPy、SciPy和matplotlib之上,提供了简单而有效的工具用于数据挖掘和数据分析。sklearn支持监督学习和无监督学习算法&#…...
SpringBoot 自动配置原理
一、Condition Condition 是在 Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操 作。 思考: SpringBoot 是如何知道要创建哪个 Bean 的?比如 SpringBoot 是如何知道要创建 RedisTemplate 的? …...
Redisson中RQueue的使用场景附一个异步的例子
RQueue 是一个基于 Redis 的分布式作业队列系统,它允许开发者在 Ruby 应用程序中实现异步任务处理和计划任务调度。由于 Redis 提供了高性能的内存数据结构存储,RQueue 可以快速地存储和检索队列中的任务,这使得它非常适合于高并发和低延迟的…...
SpringMVC 控制层框架-下
五、SpringMVC其他扩展 1. 异常处理机制 1.1 异常处理概念 开发过程中是不可避免地会出现各种异常情况,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中&a…...
(四)js前端开发中设计模式之工厂方法模式
工厂方法模式,通过对产品类的抽象,使其创建业务主要用于负责创建多类产品的实例 const Java function (content) {this.content content;(function () {let oDiv document.createElement(div)oDiv.innerHTML contentoDiv.style.color greendocument.getElement…...
新版GPT-4omini上线!快!真TM快!
大半夜,OpenAI突然推出了GPT-4o mini版本。 当我看到这条消息时,正准备去睡觉。mini版本质上是GPT-4o模型的精简版本,没有什么革命性的创新,因此我并没有太在意。 结果今天早上一觉醒来发现伴随GPT-4o mini上线,官网和…...
【Unity】RPG2D龙城纷争(十七)敌方常规AI(Normal)的实现
更新日期:2024年7月24日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、AI_Normal类二、AI调遣策略第一阶段:收集1.提供战场数据收集方法2.收集战场数据三、AI调遣策略第二阶段:评估四、AI调遣策略第三阶段:行动简介 AI_Normal定位为框架自带的最基础的…...
Tracy 小笔记:微信小程序 mpx 雷达图的实现
使用文档: https://www.kancloud.cn/xchhhh/wx-chart/399337 https://github.com/xiaolin3303/wx-charts https://gitee.com/mirrors/wx-charts/#wx-charts 参数说明: https://github.com/xiaolin3303/wx-charts/issues/56 下载 dist 里的 wx-charts-…...
Unity UGUI 之 Input Field
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Input Field是什么? 给玩家提供输入的输入框 2.重要参数 中英文对照着看…...
SpringBoot接入mongodb例子,并有增删改查功能
1,首先,在pom.xml中添加依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!--上面这…...
类和对象(三)
目录 一. 构造函数初始化列表 二. 类型转换 三. static成员 四. 友元 五. 内部类 六. 匿名对象 七. 对象拷贝时的编译器优化 一. 构造函数初始化列表 1. 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式&…...
Android SurfaceFlinger——GraphicBuffer初始化(二十九)
在 SurfaceFlinger 中,GraphicBuffer 是一个关键的数据结构,用于封装和管理图形数据的内存缓冲区。它不仅在 SurfaceFlinger 内部使用,也被其他组件如 GPU 驱动、摄像头服务、视频解码器等广泛利用,以实现高效的数据交换和图形渲染。 一、概述 GraphicBuffer 对象封装了一…...
pytest:4种方法实现 - 重复执行用例 - 展示迭代次数
简介:在软件测试中,我们经常需要重复执行测试用例,以确保代码的稳定性和可靠性。在本文中,我们将介绍四种方法来实现重复执行测试用例,并显示当前迭代次数和剩余执行次数。这些方法将帮助你更好地追踪测试执行过程&…...
一文入门SpringSecurity 5
目录 提示 Apache Shiro和Spring Security 认证和授权 RBAC Demo 环境 Controller 引入Spring Security 初探Security原理 认证授权图示编辑 图中涉及的类和接口 流程总结 提示 Spring Security源码的接口名和方法名都很长,看源码的时候要见名知意&am…...
IPython的HTML魔法:%%html_header命令全解析
IPython的HTML魔法:%%html_header命令全解析 在IPython和Jupyter Notebook中,%%html_header是一个魔术命令,它允许用户在Notebook的单元格中添加HTML头部(head)内容。这个功能特别有用,当你需要定制Notebo…...
将SQL中的占位符替换成参数
将SQL中的占位符替换成参数 描述 描述 此方法是将SQL中的${}或#{}替换为直接拼接到SQL中或直接替换为?的形式。具体详情看下面代码。 import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author HuYu* date 2023-09-21* since 1.0**…...
锁相环 vivado FPGA
原理 同步状态/跟踪状态:相位差在2kπ附近,频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带:delta w的最大值,大于这个值的话就不能捕获鉴相器(PD-phase discriminator):相乘加LPF&…...
英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载
下载链接: 链接1:https://pan.baidu.com 链接2:/s/1fxRUGnlJrKEzQVF6k1GmBA 提取码:b69t 由于是英文版,可能有些看着不太方便,可以在网页版使用以下软件中英文对照着看,看着更舒服,…...
《Dynamic Statistical Learning in Massive Datastreams》论文阅读笔记
论文地址: https://www3.stat.sinica.edu.tw/ss_newpaper/SS-2023-0195_na.pdf 论文题目翻译:《在大规模数据流中的动态统计学习》 核心观点: 动态跟踪和筛选框架(DTS):论文提出了一个在线学习和模型更新的新框架&…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
