📜  使用计算机图形绘制交通灯模拟的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:22:26.661000             🧑  作者: Mango

使用计算机图形绘制交通灯模拟的 C++ 程序

本程序使用 C++ 和计算机图形学库绘制了一个简单的交通灯模拟,可以用来学习和了解计算机图形学的基本概念和应用。

实现功能
  • 绘制三个圆形灯罩(红、黄、绿)和一个灯杆。
  • 通过改变三个灯罩的颜色和闪烁状态,实现交通灯的模拟效果。
程序界面

以下为程序运行后的界面截图:

traffic_light

灯色和状态会随机变化,如下图所示:

traffic_light_animation

实现方法

本程序使用 C++ 编写,需要使用计算机图形学库。其中,本程序使用了 EasyX 图形库和 Windows.h 头文件中的 Sleep() 函数。

首先需在 Visual Studio 或其他 C++ 开发环境中安装 EasyX 图形库。然后,按照以下步骤进行程序编写和调试:

1. 引入头文件
#include <graphics.h>
#include <Windows.h>

其中,graphics.h 是 EasyX 图形库的头文件,Windows.h 包含 Sleep() 函数的定义。

2. 设定交通灯的位置和大小
const int LIGHT_X = 300; // 灯的位置 x 坐标
const int LIGHT_Y = 200; // 灯的位置 y 坐标
const int LIGHT_R = 50;  // 灯的半径
const int POLE_W = 10;   // 灯杆宽度
const int POLE_H = 300;  // 灯杆高度

LIGHT_X 和 LIGHT_Y 是交通灯的位置参数,LIGHT_R 是交通灯灯罩的半径,POLE_W 和 POLE_H 是灯杆的宽度和高度。

3. 绘制交通灯
void drawTrafficLight(int r, int g, int y)
{
    // 绘制灯杆
    setfillcolor(DARKGRAY);
    bar(LIGHT_X - POLE_W / 2, LIGHT_Y + LIGHT_R, LIGHT_X + POLE_W / 2, LIGHT_Y + LIGHT_R + POLE_H);

    // 绘制红色灯罩
    setfillcolor(r ? RED : DARKGRAY);
    fillcircle(LIGHT_X, LIGHT_Y, LIGHT_R);

    // 绘制黄色灯罩
    setfillcolor(y ? YELLOW : DARKGRAY);
    fillcircle(LIGHT_X, LIGHT_Y + LIGHT_R * 2, LIGHT_R);

    // 绘制绿色灯罩
    setfillcolor(g ? GREEN : DARKGRAY);
    fillcircle(LIGHT_X, LIGHT_Y + LIGHT_R * 4, LIGHT_R);
}

此函数接受三个参数,即三个灯罩颜色的标志位 r、g、y(0 表示黑灯,1 表示彩灯)。用 setfillcolor() 函数设置颜色后,使用 fillcircle() 函数绘制圆形灯罩。

4. 控制灯的状态
void lightStatus(int r, int g, int y, int t)
{
    // 交通灯灯状态的控制
    drawTrafficLight(r, g, y);
    Sleep(t);
    cleardevice();
}

此函数接受四个参数,即三个灯罩颜色的标志位 r、g、y 和灯亮的时间 t(单位为毫秒)。

使用 drawTrafficLight() 函数绘制交通灯,然后使用 Sleep() 函数暂停程序执行给定的时间长度,最后使用 cleardevice() 函数清除原有的绘图内容。

5. 控制交通灯闪烁
void lightBlink(int r, int g, int y, int t, int n)
{
    // 交通灯灯状态的闪烁
    for (int i = 0; i < n; i++) {
        drawTrafficLight(r, g, y);
        Sleep(t);
        cleardevice();
        drawTrafficLight(0, 0, 0);
        Sleep(t);
        cleardevice();
    }
}

此函数接受五个参数,即三个灯罩颜色的标志位 r、g、y,灯亮的时间 t 和闪烁的次数 n。

使用 drawTrafficLight() 函数绘制交通灯,然后使用 Sleep() 函数暂停程序执行给定的时间长度,使用 cleardevice() 函数清除原有的绘图内容,并使用 drawTrafficLight(0,0,0) 函数绘制黑灯来表示交通灯灭的状态。

6. 主程序
int main()
{
    // 初始化 EasyX 图形窗口
    initgraph(640, 480);

    // 绘制交通灯
    lightStatus(1, 0, 0, 2000);  // 亮红灯
    lightStatus(0, 0, 1, 1000);  // 亮黄灯
    lightStatus(0, 1, 0, 2000);  // 亮绿灯
    lightBlink(1, 0, 0, 500, 10);  // 闪烁红灯10次
    lightBlink(0, 1, 0, 500, 10);  // 闪烁绿灯10次

    // 关闭 EasyX 图形窗口
    closegraph();
    return 0;
}

主程序中,使用 initgraph() 函数初始化 EasyX 图形窗口,然后按照规定顺序调用 lightStatus() 和 lightBlink() 函数来绘制交通灯的亮灯和闪烁效果。

最后,使用 closegraph() 函数关闭 EasyX 图形窗口,并返回程序运行结果。

总结

本程序通过对计算机图形学库的基本使用,实现了交通灯模拟的基本功能。如果您对计算机图形学和 C++ 编程感兴趣,可以结合本程序源码进行学习和实践。