C/C++樱花树代码

CSDN 2024-07-27 12:05:02 阅读 82

目录

写在前面

系列文章

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++被广泛应用于系统开发、游戏开发、图形界面开发等领域。

完整代码

<code>#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函数来更新程序的状态。

写在后面

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。