• C++
  • C++ 图形绘制与小球运动模拟学习笔记

  • @ 2025-7-11 22:01:59

C++ 图形绘制与小球运动模拟学习笔记

一、基础准备

(一)引入工具库

  • #include <graphics.h>:这是图形绘制工具库,能帮我们弹出窗口、画各种图形,比如圆形 。就像画画的“画笔工具包”,有了它才能在电脑上画出图形。
  • #include <math.h>:数学工具库,虽然这几节课暂时用不太上,但和 graphics.h 搭配经常会用到,比如计算复杂图形的位置时可能会用到数学公式 ,像算圆形运动轨迹的曲线之类的。
  • #include <conio.h>:按键检测工具库,能让程序等我们按按键后再关闭窗口。比如你画了个画,想看完再关窗口,按个键就行,它就是负责这个“等待按键”功能的。
  • using namespace std;:这个是为了方便使用标准库的内容,不然每次用 cout 这些都要写 std::cout ,比较麻烦,就像给标准库开了个“快捷通道” 。

二、简单图形绘制(静态圆形)

(一)代码示例

// 引入图形绘制工具库,能弹出窗口、画图形
#include <graphics.h>  
// 引入数学工具库(暂时用不上,但图形库常一起用 )
#include <math.h>  
// 引入按键检测工具库,让程序等我们按按键再关闭
#include <conio.h>  
using namespace std;  

int main() {  
    // 定义窗口高度,设为1000像素,让窗口长一点好放圆形
    const int height = 1000;  
    // 初始化图形窗口,宽度600像素,高度用上面定义的height
    initgraph(600, height);  

    // 画圆形,circle函数参数是(圆心X坐标,圆心Y坐标,半径)
    // 第一个圆形,圆心Y在height/4位置,半径50
    circle(300, 1 * height / 4, 50);  
    // 延时1秒,让我们能看到圆形,Sleep函数参数是毫秒数,1000毫秒=1秒
    Sleep(1000);  
    // 第二个圆形,圆心Y在2*height/4位置
    circle(300, 2 * height / 4, 50);  
    Sleep(1000); 
    // 第三个圆形,圆心Y在3*height/4位置 
    circle(300, 3 * height / 4, 50);  
    Sleep(1000);  

    // 让程序暂停,等按任意按键再关闭窗口,不然窗口一闪就没啦
    getch();  

    // 关闭图形窗口,释放资源,就像用完东西要收拾好
    closegraph();  

    return 0;  
}  

(二)代码解释

  • initgraph(600, height);:初始化一个图形窗口,宽 600 像素,高 height(这里是 1000 像素) 。可以想象成打开一个画画的画布。
  • circle(300, 1 * height / 4, 50);:画圆形,300 是圆心的 X 坐标(水平方向位置,这里在窗口中间),1 * height / 4 是圆心的 Y 坐标(垂直方向位置,把窗口高度分成 4 份,在第一份的位置),50 是半径 。
  • Sleep(1000);:让程序暂停 1000 毫秒(1 秒),这样我们就能看到画出来的圆形,不然程序跑得太快,刚画就没了 。
  • getch();:等待用户按任意按键,按了之后程序才继续执行关闭窗口的操作 。
  • closegraph();:关闭图形窗口,释放电脑资源,就像用完画画工具把画布收起来 。

三、小球下落动画(动态效果)

(一)基础下落(匀速)

代码示例

#include <graphics.h>
#include <conio.h>
using namespace std;

int main() {
    const int height = 1000;
    initgraph(600, height);
    // 小球初始 Y 坐标
    int y = 50;  
    while (1) {  
        // 清屏,把之前画的内容擦掉,不然小球会有很多残影
        cleardevice();  
        // 画小球,圆心 X 是 300,Y 是 y,半径 20
        circle(300, y, 20);  
        // 让小球 Y 坐标增加 1,往下落
        y += 1;  
        // 暂停 20 毫秒,控制下落速度,数值越大下落越慢
        Sleep(20);  
        // 落到 800 位置就停止(可以自己改停止位置)
        if (y >= 800) {  
            break;  
        }
    }
    getch();
    closegraph();
    return 0;
}

代码解释

  • cleardevice();:清屏函数,每次循环都把之前画的小球擦掉,这样新画的小球位置才清晰,不然小球移动会留下一串残影 。
  • y += 1;:让小球的 Y 坐标每次增加 1,这样小球就会往下移动,产生下落的效果 。
  • Sleep(20);:控制小球下落的速度,暂停 20 毫秒,数值越大,小球下落得越慢,就像走路一步停久一点 。
  • if (y >= 800) { break; }:当小球落到 Y 坐标 800 的位置时,就跳出循环,停止下落 。

(二)加速下落

代码示例

#include <graphics.h>
#include <conio.h>
using namespace std;

int main() {
    const int height = 1000;
    initgraph(600, height);
    double y = 50;
    // 加速度,每次让速度增加的值
    double addy = 0;  
    while (1) {
        cleardevice();
        circle(300, y, 20);
        y = y + addy;
        // 每次让速度增加 0.5,这样小球会越来越快
        addy = addy + 0.5;  
        Sleep(10);
        if (y >= 800) {
            break;
        }
    }
    getch();
    closegraph();
    return 0;
}

代码解释

  • double addy = 0;:定义一个加速度相关的变量,用来控制小球下落的速度变化 。
  • y = y + addy;:小球的 Y 坐标变化不再是固定增加 1,而是加上 addy 的值,这样速度会变化 。
  • addy = addy + 0.5;:每次让 addy 增加 0.5,也就是让小球下落速度越来越快,模拟加速下落的效果,像从高处往下扔东西,会越落越快 。

(三)带反弹的下落

代码示例

#include <graphics.h>
#include <conio.h>
#include <iostream>
using namespace std;

int main() {
    const int height = 1000;
    initgraph(600, height);
    double y = 50;
    double addy = 0;
    while (1) {
        cleardevice();
        y = y + addy;
        addy = addy + 0.5;
        if (y >= 800) { 
            // 碰到“地面”,速度反向并减小,这里乘以 -0.75 模拟反弹后速度变慢
            addy = -0.75 * addy;  
        }
        if (y > 800) {
            // 让小球刚好停在“地面”位置,不然可能会穿过去
            y = 800;  
        }
        circle(300, y, 20);
        Sleep(10);
        // 可以输出看看速度变化,方便理解
        cout << y << "------" << addy << endl;  
    }
    getch();
    closegraph();
    return 0;
}

代码解释

  • if (y >= 800) { addy = -0.75 * addy; }:当小球落到 800 位置(碰到“地面”),让速度 addy 乘以 -0.75 ,这样速度方向就反过来(往上),而且大小变小,模拟小球反弹后速度减慢的效果,就像现实中球落地会弹起来,而且越弹越低 。
  • if (y > 800) { y = 800; }:防止小球因为速度的问题,Y 坐标超过 800 太多,让它刚好停在 800 位置,看起来更像碰到地面 。
  • cout << y << "------" << addy << endl;:输出小球的 Y 坐标和速度 addy 的值,这样在运行程序时,你能在控制台看到数值变化,更清楚小球怎么运动的 。

四、总结

  • 我们学会了用 graphics.h 库画静态圆形,通过 circle 函数设置圆心和半径 。
  • 做出了小球下落的动画,从匀速下落,到加速下落,还实现了碰到“地面”反弹的效果 。
  • 用到的关键函数有 initgraph(初始化窗口)、circle(画圆形)、cleardevice(清屏)、Sleep(控制延时,调整速度)、getch(等待按键)、closegraph(关闭窗口) 。这些就像我们画画和做动画的“小工具”,组合起来就能做出好玩的图形和动画啦,大家可以自己改改数值,看看小球运动有啥变化,探索更多好玩的效果!

1 条评论

  • @ 2025-7-11 22:03:46

    C++ 图形编程基础(小球动画)学习笔记

    一、基础准备

    1. 头文件引入

    // 图形绘制库,用来弹出窗口、画图形,比如画圆形等
    #include <graphics.h> 
    // 数学工具库,后续如果涉及复杂计算(如小球运动轨迹公式)可能会用到,先引入备用
    #include <math.h> 
    // 按键检测库,让程序能等我们按按键后再关闭窗口,不然窗口会一闪就没啦
    #include <conio.h> 
    // 输入输出流库,用来像cout输出内容到控制台
    #include <iostream> 
    using namespace std; 
    

    2. 窗口初始化

    const int height = 1000; // 定义窗口高度,数值越大窗口纵向越长,这里设1000像素
    initgraph(600, height); // 初始化图形窗口,参数是(宽度,高度),这里宽度600像素、高度用上面定义的height
    

    作用:创建一个能用来画图的窗口,就像我们画画的“画布窗口”,宽度 600 像素,高度 1000 像素 。

    二、简单圆形绘制(静态)

    // 画圆形,参数是(圆心X坐标,圆心Y坐标,半径)
    circle(300, 1 * height / 4, 50); 
    Sleep(1000); // 让程序停顿1000毫秒(1秒),这样我们能看到画的圆形,不然一下就画下一个了
    circle(300, 2 * height / 4, 50); 
    Sleep(1000);
    circle(300, 3 * height / 4, 50); 
    Sleep(1000);
    

    解释:

    • circle 函数用来画圆,300 是圆心在窗口水平方向的位置(固定在中间),1 * height / 4 等是圆心在垂直方向的位置,50 是圆的半径 。
    • Sleep(1000) 就是让程序“休息”1秒,方便我们看清每个圆的绘制 。

    三、小球下落动画(动态)

    1. 基础下落(匀速)

    int y = 50; // 小球初始的垂直位置(圆心Y坐标)
    int addy = 1; // 每次下落的步长,也就是每次往下移动1个像素
    while (1) { // 循环,让小球一直动起来(直到按按键停止)
        cleardevice(); // 清屏函数,把之前画的内容清掉,不然小球会有很多“残影”
        circle(300, y, 20); // 画小球,圆心X固定300,Y是y,半径20
        if (y >= 800) { // 当小球落到800像素位置(类似地面),就停止
            break; 
        }
        y += addy; // 小球位置往下移动addy个像素
        Sleep(10); // 停顿10毫秒,控制小球下落速度,数字越小下落越快
    }
    

    逻辑:小球从 y = 50 开始,每次往下移动 1 个像素,每次移动后清屏重画,看起来就像小球在连续下落,直到碰到“地面”(y >= 800) 。

    2. 加速下落

    double y = 50; // 用double类型,能更精确控制位置
    double addy = 0; // 初始速度设为0
    while (1) { 
        cleardevice(); 
        circle(300, y, 20); 
        if (y >= 800) { 
            // 碰到地面,改变速度(这里是让速度反向且减小,模拟反弹,比如乘以 -0.75 )
            addy = -0.75 * addy; 
        }
        if (y > 800) { 
            y = 800; // 限制小球位置,别跑到地面下面
        }
        y = y + addy; // 小球新位置 = 原来位置 + 速度
        addy = addy + 0.5; // 速度每次增加0.5,模拟加速下落
        Sleep(10); 
        cout << y << "------" << addy << endl; // 输出小球位置和速度,方便我们看变化
    }
    

    解释:

    • 一开始小球速度 addy0,然后每次循环速度增加 0.5,所以小球会加速下落 。
    • 碰到“地面”(y >= 800)时,速度乘以 -0.75,方向反过来(模拟反弹),而且速度大小变小(模拟碰撞能量损失 )。
    • cout 用来在控制台输出小球的位置 y 和当前速度 addy,能让我们更清楚小球运动状态 。

    四、程序收尾

    getch(); // 等我们按任意按键,程序才继续执行后面的关闭操作,不然窗口一下就关了
    closegraph(); // 关闭图形窗口,释放电脑资源
    return 0; 
    

    作用:getch() 让程序“等一等”我们按按键,closegraph() 把之前创建的图形窗口关掉,释放资源,让程序正常结束 。

    五、整体逻辑梳理

    1. 先引入需要的工具库,就像准备好画画的笔、纸、颜料等 。
    2. 创建图形窗口,作为“画布” 。
    3. 要么画静态的圆形,要么通过循环、清屏、改变位置,做出小球下落(匀速、加速、反弹等)的动画效果 。
    4. 最后通过按键控制程序关闭,并释放窗口资源 。

    这样一步步下来,就能用 C++ 画出静态圆形、做出小球下落的动画啦,从简单到复杂,慢慢就能做出更有趣的图形效果哟,就像搭积木一样,把这些知识模块组合起来,就能创造出更多好玩的动画啦!

    • 1