C/C++樱花树代码

news2024/11/15 22:11:01

目录

写在前面

系列文章

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.coloradmin.cn/o/1947824.html

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

相关文章

深入理解TCP:互联网通信的基石

深入理解TCP&#xff1a;互联网通信的基石 引言TCP的普遍应用TCP连接的建立与维护三次握手&#xff08;Three-Way Handshake&#xff09;连接的可靠性与超时重传数据传输与流量控制连接的终止状态转换 TCP与UDP的对比TCP协议栈的层级结构应用层&#xff08;Application Layer&a…

24下软考初级-网络管理员100条知识点速记!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备备考下半年软考初级-网络管理员的小伙伴可以开始准备了&#xff0c;这里给大家整理了100条网管知识点汇总&#xff0c;涵盖全书90%重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这…

androidTest 与 Test详解

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Server - 配置 Kubernetes 多任务流程 KubeFlow Pipeline 的开发教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/140281680 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Kubern…

错误解决 error CS0117: ‘Buffer‘ does not contain a definition for ‘BlockCopy‘

Unity 2022.3.9f1 导入 Runtime OBJ Importer 后出现&#xff1a; error CS0117: ‘Buffer’ does not contain a definition for ‘BlockCopy’ 解决办法&#xff1a; 源代码&#xff1a; int DDS_HEADER_SIZE 128; byte[] dxtBytes new byte[ddsBytes.Length - DDS_HEAD…

深度学习系列一

激活函数 sigmod 梯度消失问题&#xff1a; sigmoid函数的导数在输入值较大或较小时接近于0。在反向传播过程中&#xff0c;这些小梯度会相乘&#xff0c;导致深层网络的梯度变得非常小。结果是&#xff0c;深层网络的参数几乎不会更新&#xff0c;训练变得非常困难。这就是为…

基于flask的天气数据可视化系统1.0

基于flask的天气数据可视化系统1.0 一、效果展示二、flask简介三、图表绘制四、前端页面编写五、完整代码一、效果展示 该flask项目相对简单入门,使用了flask框架、bootstrap前端技术,数据使用的是上一篇scrapy爬取城市天气数据中爬取到的数据。 二、flask简介 Flask是一个…

在linux中,如何搭建nacos2.4.0的版本,修改nacos密码

由于最近服务器经常被攻击&#xff0c;看了一下发现是nacos版本过低&#xff0c;导致被抓了肉鸡&#xff0c;导致服务器的网端被跑满&#xff0c;选择重新搭建nacos&#xff0c;进入服务器后&#xff0c;首先确定服务器是否安装java&#xff0c;先执行java -version&#xff0c…

如何应对SQL注入攻击?

引言 在现今的网络世界中&#xff0c;安全性已成为至关重要的话题。SQL注入&#xff08;SQL Injection&#xff09;是一种常见且危险的网络攻击方式&#xff0c;攻击者通过向SQL查询中插入恶意代码来操控数据库&#xff0c;从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

【数据结构】建堆算法复杂度分析及TOP-K问题

【数据结构】建堆算法复杂度分析及TOP-K问题 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…

C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用

文章目录 0. 引言1. Iceoryx使用到的零拷贝技术1.1 零拷贝技术概述1.2 零拷贝的优势1.3 Iceoryx零拷贝的实现1.4 信息轮询与信号触发 2. Iceoryx的核心概念2.1 RouDi (iox-roudi)2.2 Runtime2.3 Publisher2.4 Subscriber2.5 Topic 3. Iceoryx使用示例3.1 发布者程序3.2 订阅者程…

1万+台网络设备运维如何选择支撑工具?

针对1万台网络设备的运维管理&#xff0c;需要采取一套系统化、自动化且高效的管理方法与策略。“工欲善其事&#xff0c;必先利其器”&#xff0c;以下结合一些关键步骤探讨运维支撑软件工具的方案。 1 建立完善的设备档案 设备信息记录&#xff1a; 为每台设备建立详细的…

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展&#xff0c;最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度&#xff0c;充分利用现有计算资源&#xff0c;显著提升长安链交易处理速度。 随着区块…

安卓单机游戏:《植物大战僵尸:重生》一款深受玩家喜爱的塔防游戏

一款深受玩家喜爱的塔防游戏&#xff0c;在这个游戏中&#xff0c;玩家需要通过种植不同类型的植物来阻止不断涌来的僵尸入侵&#xff0c;而每种植物都有自己的能力与特点&#xff0c;游戏画面和音效都非常出色&#xff0c;剧情也十分有趣&#xff0c;难度不断升级&#xff0c;…

JAVA代码审计JAVA0基础学习(需要WEB基础知识)DAY2

JAVA 在 SQL执行当中 分为3种写法&#xff1a; JDBC注入分析 Mybatis注入分析 Hibernate注入分析 JDBC 模式不安全JAVA代码示例部分特征 定义了一个 sql 参数 直接让用户填入id的内容 一个最简单的SQL语句就被执行了 使用安全语句却并没有被执行 Mybatis&#xff1a; #…

第13周 简历职位功能开发与Zookeeper实战

第13周 简历职位功能开发与Zookeeper实战 本章概述1. Mysql8窗口函数over使用1.1 演示表结构与数据1.2 案例1:获取男女总分数1.3 案例2****************************************************************************************本章概述 1. Mysql8窗口函数over使用 参考案例…

行业不同怎么选企业管理咨询公司

在选择企业管理咨询公司时&#xff0c;不同行业的企业往往面临着各自独特的挑战和需求。因此&#xff0c;选择一家适合自身行业特点、能够提供专业且有针对性的咨询服务的管理咨询公司至关重要。本文将从行业差异的角度出发&#xff0c;探讨如何根据企业所在行业的不同&#xf…

二维码的生成与识别(python)

二维码生成 from PIL import Image import qrcode from qrcode.image.styledpil import StyledPilImage from qrcode.image.styles.colormasks import SolidFillColorMask from qrcode.image.styles.moduledrawers import SquareModuleDrawer# 创建二维码对象 qr qrcode.QRCo…

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…