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

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语言的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值