zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言/C++常见习题问答集锦(七十六)之玫瑰花寄语

C++C语言 常见 习题 集锦 问答
2023-09-14 09:01:32 时间

C语言/C++常见习题问答集锦(七十六)之玫瑰花寄语

程序之美

在这里插入图片描述
在古希腊神话中,玫瑰花集爱与美于一身,既是美神的化身,又溶进了爱神的血液。可以说,在世界范围内,玫瑰是用来表达爱情的通用语言,形成了永不凋零的玫瑰花花语文化。

玫瑰数的含意如下:
1朵玫瑰代表——我的心中只有你 ONLY YOU!
2朵玫瑰代表——这世界只有我俩!
3朵玫瑰代表——我爱你 I LOVE YOU!
4朵玫瑰代表——至死不渝!
5朵玫瑰代表——由衷欣赏!
6朵玫瑰代表——互敬 互爱 互谅!
7朵玫瑰代表——我偷偷地爱著你!
8朵玫瑰代表——感谢你的关怀扶持及鼓励!
9朵玫瑰代表——长久 ALWAYS!
10朵玫瑰代表——十全十美 无懈可击!
11朵玫瑰代表——最爱 只在乎你一人!
12朵玫瑰代表——对你的爱与日俱增!
13朵玫瑰代表——友谊长存!
14朵玫瑰代表——骄傲!
15朵玫瑰代表——对你感到歉意I’M SORRY!
16朵玫瑰代表——多变不安的爱情!
17朵玫瑰代表——绝望无可挽回的爱!
18朵玫瑰代表——真诚与坦白!
19朵玫瑰代表——忍耐与期待!
20朵玫瑰代表——我仅一颗赤诚的心!
21朵玫瑰代表——真诚的爱!
22朵玫瑰代表——祝你好运!
25朵玫瑰代表——祝你幸福!
30朵玫瑰代表——信是有缘!
36朵玫瑰代表——浪漫!
40朵玫瑰代表——誓死不渝的爱情!
50朵玫瑰代表——邂逅不期而遇!
99朵玫瑰代表——天长地久 FOREVER!
100朵玫瑰代表——百分之百的爱 100% LOVE!
101朵玫瑰代表——最……最爱!
108朵玫瑰代表——求 婚!
999朵玫瑰代表——我家有钱,呵呵

奥里给,让我们敲起手中的键盘,绘制一朵玫瑰花吧!!!

先上效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码原型:

#include <graphics.h>
#include <conio.h>
#include <math.h>

// 定义全局变量

int rosesize = 500;
int h = -250;

// 定义结构体

struct DOT
{
	double x;
	double y;
	double z;
	double r;// 红色
	double g;// 绿色

	// b(蓝色) 通过 r 计算

};

// 计算点
bool calc(double a, double b, double c, DOT &d)
{
	double j, n, o, w, z;


	if (c > 60)// 花柄
	{
		d.x = sin(a * 7)*(13 + 5 / (0.2 + pow(b * 4, 4))) - sin(b) * 50;

		d.y = b * rosesize + 50;

		d.z = 625 + cos(a * 7)*(13 + 5 / (0.2 + pow(b * 4, 4))) + b * 400;

		d.r = a * 1 - b / 2;

		d.g = a;

		return true;

	}

	double A = a * 2 - 1;

	double B = b * 2 - 1;

	if (A*A + B * B < 1)
	{
		if (c > 37)// 叶
		{
			j = (int(c) & 1);
			n = j ? 6 : 4;
			o = 0.5 / (a + 0.01) + cos(b * 125) * 3 - a * 300;
			w = b * h;

			d.x = o * cos(n) + w * sin(n) + j * 610 - 390;
			d.y = o * sin(n) - w * cos(n) + 550 - j * 350;
			d.z = 1180 + cos(B + A) * 99 - j * 300;
			d.r = 0.4 - a * 0.1 + pow(1 - B * B, -h * 6)*0.15 - a * b*0.4 + cos(a + b) / 5 + pow(cos((o*(a + 1) + (B > 0 ? w : -w)) / 25), 30)*0.1*(1 - B * B);
			d.g = o / 1000 + 0.7 - o * w*0.000003;

			return true;
		}

		if (c > 32)// 花萼
		{
			c = c * 1.16 - 0.15;
			o = a * 45 - 20;
			w = b * b*h;
			z = o * sin(c) + w * cos(c) + 620;

			d.x = o * cos(c) - w * sin(c);
			d.y = 28 + cos(B*0.5) * 99 - b * b*b * 60 - z / 2 - h;
			d.z = z;
			d.r = (b*b*0.3 + pow((1 - (A*A)), 7)*0.15 + 0.3)*b;
			d.g = b * 0.7;
			return true;
		}

		// 花

		o = A * (2 - b)*(80 - c * 2);
		w = 99 - cos(A) * 120 - cos(b)*(-h - c * 4.9) + cos(pow(1 - b, 7)) * 50 + c * 2;
		z = o * sin(c) + w * cos(c) + 700;

		d.x = o * cos(c) - w * sin(c);
		d.y = B * 99 - cos(pow(b, 7)) * 50 - c / 3 - z / 1.35 + 450;
		d.z = z;
		d.r = (1 - b / 1.2)*0.9 + a * 0.1;
		d.g = pow((1 - b), 20) / 4 + 0.05;
		return true;
	}
	return false;
}


// 主函数
void main()
{
	// 定义变量
	short *zBuffer;
	int x, y, z, zBufferIndex;
	DOT dot;
	// 初始化

	initgraph(640, 480);// 创建绘图窗口
	setbkcolor(WHITE); // 设置背景色为白色
	cleardevice(); // 清屏

	// 初始化 z-buffer

	zBuffer = new short[rosesize*rosesize];

	memset(zBuffer, 0, sizeof(short)*rosesize*rosesize);

	for (int j = 0; j < 2000 && !_kbhit(); j++) // 按任意键退出
	{
		for (int i = 0; i < 10000; i++)// 减少是否有按键的判断

			if (calc(double(rand()) / RAND_MAX, double(rand()) / RAND_MAX, rand() % 46 / 0.74, dot))
			{
				z = int(dot.z + 0.5);
				x = int(dot.x*rosesize / z - h + 0.5);
				y = int(dot.y*rosesize / z - h + 0.5);
				if (y >= rosesize)continue;

				zBufferIndex = y * rosesize + x;

				if (!zBuffer[zBufferIndex] || zBuffer[zBufferIndex] > z)
				{
					zBuffer[zBufferIndex] = z;
					// 画点
					int r = ~int((dot.r*h));
					if (r < 0)r = 0;
					if (r > 255)r = 255;
					int g = ~int((dot.g*h));
					if (g < 0)g = 0;
					if (g > 255)g = 255;
					int b = ~int((dot.r*dot.r*-80));
					if (b < 0)b = 0;
					if (b > 255)b = 255;

					putpixel(x + 50, y - 20, RGB(r, g, b));
				}
			}
		Sleep(1);
	}

	// 退出

	delete[]zBuffer;
	_getch();
	closegraph();
}

好了,今天就说这么多了,希望小伙伴们能从这篇文章中学到东西,也真心希望能够帮助正在苦学C语言的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章。