用C语言绘制夜空中的星星和太阳
在本篇博客中,我们将探讨一个使用C语言和EasyX图形库绘制夜空中星星和太阳的示例程序。这个程序使用了C语言和EasyX图形库,为您展示了如何创建一个简单而美丽的夜空效果。
准备工作
在开始之前,您需要确保已经安装EasyX图形库,它是一个在Windows平台上用于绘制图形的开源库。您可以从EasyX官网下载并安装它。
代码解析
以下是这个程序的主要部分以及其功能的解释:
-
导入必要的库文件:
#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; // 星星颜色 };
-
初始化星星:
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); }
行星的初始位置是窗口的最左边,所以横坐标为零,行星的位置要是无规律,所以纵坐标随机,亮度随机。
- 移动星星:
// 移动星星
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) { // ... // 绘制太阳 for (int r = 30; r < 105; r++) { // ... circle(x, y, r); } // ... }
为了画出这个圆形的颜色渐变,所以越到外面颜色越白越亮,且太阳的样子需从想要的效果中取样,大致得到变化的各级阶段和其步长。我这个就是从现实中日落的照片中取样得到的。
- 主函数:
循环是为了控制时间做一个量化,大概知道一个循环两个物体出现时间的的比例。
外循环是为了循环放映动画。
**
全部程序
**
#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
嵌入代码:
运行程序
编译并运行程序后,您将看到一个美丽的夜空,星星闪烁,太阳慢慢升起。程序会一直运行,直到按下任意键退出。