用C语言绘制夜空中的星星和太阳

用C语言绘制夜空中的星星和太阳

在本篇博客中,我们将探讨一个使用C语言和EasyX图形库绘制夜空中星星和太阳的示例程序。这个程序使用了C语言和EasyX图形库,为您展示了如何创建一个简单而美丽的夜空效果。

在这里插入图片描述

准备工作

在开始之前,您需要确保已经安装EasyX图形库,它是一个在Windows平台上用于绘制图形的开源库。您可以从EasyX官网下载并安装它。

代码解析

以下是这个程序的主要部分以及其功能的解释:

  1. 导入必要的库文件:

    #include <graphics.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
    
  2. 定义窗口的长宽:

    #define longth 720
    #define width 1280
    
  3. 创建星星的结构体:

    struct STAR
    {
        double x; // 星星横坐标
        int y; // 星星纵坐标
        double step; // 星星移动速度
        int color; // 星星颜色
    };
    
  4. 初始化星星:

    void InitStar(int i)
    {
        // 初始化星星属性
        star[i].x = 0;
        star[i].y = rand() % longth;
        star[i].step = 3;
        star[i].color = rand() % 250;
        star[i].color = RGB(star[i].color, star[i].color, star[i].color);
    }
    

行星的初始位置是窗口的最左边,所以横坐标为零,行星的位置要是无规律,所以纵坐标随机,亮度随机。

  1. 移动星星:
// 移动星星
void MoveStar(int i)
{
	// 清除旧的星星
	putpixel((int)star[i].x, star[i].y, BLACK);
	putpixel((int)star[i].x + 1, star[i].y, BLACK);
	putpixel((int)star[i].x, star[i].y + 1, BLACK);
	putpixel((int)star[i].x + 1, star[i].y + 1, BLACK);

	// 计算新的位置
	star[i].x += star[i].step;
	if (star[i].x > width)
		InitStar(i);

	// 画出新的星星
	putpixel((int)star[i].x, star[i].y, star[i].color);
	putpixel((int)star[i].x + 1, star[i].y, star[i].color);
	putpixel((int)star[i].x, star[i].y + 1, star[i].color);
	putpixel((int)star[i].x + 1, star[i].y + 1, star[i].color);
}
  1. 画太阳:
    void DrawSun(int x, int y)
    {
        // ...
        // 绘制太阳
        for (int r = 30; r < 105; r++)
        {
            // ...
            circle(x, y, r);
        }
        // ...
    }
    

为了画出这个圆形的颜色渐变,所以越到外面颜色越白越亮,且太阳的样子需从想要的效果中取样,大致得到变化的各级阶段和其步长。我这个就是从现实中日落的照片中取样得到的。

  1. 主函数:

循环是为了控制时间做一个量化,大概知道一个循环两个物体出现时间的的比例。
外循环是为了循环放映动画。

**

全部程序

**

#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define longth 720
#define width 1280

struct STAR      //星型结构体
{
    double x; // 星星横坐标
    int y; // 星星纵坐标
    double step; // 星星移动速度
    int color; // 星星颜色
};

STAR star[100];

主函数

int main()
{
	initgraph(width, longth, SHOWCONSOLE); // 初始化图形窗口并显示控制台
	srand((unsigned)time(NULL)); // 随机数种子

	// 初始化所有星星
	for (int i = 0; i < 100; i++)
	{
		InitStar(i);
		star[i].x = rand() % width;
	}
	//RECT t= {600,10,680,30};
	//settextcolor(RGB(250,250,250));
	BeginBatchDraw();
	// 画出星空,按任意键退出
	while (!_kbhit())
	{
		for (int i = 0; i < 12 * width; i++)
		{

			FlushBatchDraw(); // 刷新屏幕
			//drawtext(_T("行星的视角"), &t, DT_CENTER);
			if (i % 10 == 0)
			{
				for (int k = 0; k < 100; k++)
					MoveStar(k);
				if (i > 5650)
					Sleep(2);
			}
			DrawSun(i / 4 - 50, longth / 2);
		}
	}
	EndBatchDraw();
	closegraph(); // 关闭图形窗口
	return 0;
}

**

全部函数

**

#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define longth 720
#define width 1280

struct STAR //星型结构体
{
	double x; // 星星横坐标
	int y; // 星星纵坐标
	double step; // 星星移动速度
	int color; // 星星颜色
};

STAR star[100];

// 初始化星星
void InitStar(int i)
{
	star[i].x = 0; // 星星横坐标初始为0
	star[i].y = rand() % longth; // 星星的纵坐标随机生成
	star[i].step = 3; // 星星移动速度,越接近y=240速度越快
	star[i].color = rand() % 250; // 星星颜色随机生成
	star[i].color = RGB(star[i].color, star[i].color, star[i].color); // 转换成RGB颜色值
}

// 移动星星
void MoveStar(int i)
{
	// 清除旧的星星
	putpixel((int)star[i].x, star[i].y, BLACK);
	putpixel((int)star[i].x + 1, star[i].y, BLACK);
	putpixel((int)star[i].x, star[i].y + 1, BLACK);
	putpixel((int)star[i].x + 1, star[i].y + 1, BLACK);

	// 计算新的位置
	star[i].x += star[i].step;
	if (star[i].x > width)
		InitStar(i);

	// 画出新的星星
	putpixel((int)star[i].x, star[i].y, star[i].color);
	putpixel((int)star[i].x + 1, star[i].y, star[i].color);
	putpixel((int)star[i].x, star[i].y + 1, star[i].color);
	putpixel((int)star[i].x + 1, star[i].y + 1, star[i].color);
}

// 画太阳
void DrawSun(int x, int y)
{
	// 背景颜色
	double h = 224;
	double s = 222;
	double l = 0;

	setlinestyle(PS_SOLID, 1);
	for (int r = 30; r < 105; r++)
	{
		if (r < 60)
		{
			h -= 0.2;
			s -= 2.0;
		}
		else if (r < 105)
		{
			h -= 4.8;
			s -= 3.4;
		}
		setlinecolor(RGB(h, s, l));
		circle(x, y, r); // 画出太阳的圆环
	}

	// 日落
	setlinestyle(PS_SOLID, 2);
	setlinecolor(RGB(218, 221, 142));
	setfillcolor(RGB(221, 221, 231));
	fillcircle(x, y, 30); // 画出太阳的圆心
}

int main()
{
	initgraph(width, longth, SHOWCONSOLE); // 初始化图形窗口并显示控制台
	srand((unsigned)time(NULL)); // 随机数种子

	// 初始化所有星星
	for (int i = 0; i < 100; i++)
	{
		InitStar(i);
		star[i].x = rand() % width;
	}
	//RECT t= {600,10,680,30};
	//settextcolor(RGB(250,250,250));
	BeginBatchDraw();
	// 画出星空,按任意键退出
	while (!_kbhit())
	{
		for (int i = 0; i < 12 * width; i++)
		{

			FlushBatchDraw(); // 刷新屏幕
			//drawtext(_T("行星的视角"), &t, DT_CENTER);
			if (i % 10 == 0)
			{
				for (int k = 0; k < 100; k++)
					MoveStar(k);
				if (i > 5650)
					Sleep(2);
			}
			DrawSun(i / 4 - 50, longth / 2);
		}
	}
	EndBatchDraw();
	closegraph(); // 关闭图形窗口
	return 0;
}

效果演示

在哔哩哔哩上有我制作的视频
链接:
【C语言编写的宇宙中自转又公转的行星视角】 https://www.bilibili.com/video/BV1By4y1P7ny/?share_source=copy_web&vd_source=252b5b76c91287a509425978a6a72eb7

嵌入代码:

运行程序

编译并运行程序后,您将看到一个美丽的夜空,星星闪烁,太阳慢慢升起。程序会一直运行,直到按下任意键退出。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值