- 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 条评论
-
admin SU @ 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; // 输出小球位置和速度,方便我们看变化 }
解释:
- 一开始小球速度
addy
是0
,然后每次循环速度增加0.5
,所以小球会加速下落 。 - 碰到“地面”(
y >= 800
)时,速度乘以-0.75
,方向反过来(模拟反弹),而且速度大小变小(模拟碰撞能量损失 )。 cout
用来在控制台输出小球的位置y
和当前速度addy
,能让我们更清楚小球运动状态 。
四、程序收尾
getch(); // 等我们按任意按键,程序才继续执行后面的关闭操作,不然窗口一下就关了 closegraph(); // 关闭图形窗口,释放电脑资源 return 0;
作用:
getch()
让程序“等一等”我们按按键,closegraph()
把之前创建的图形窗口关掉,释放资源,让程序正常结束 。五、整体逻辑梳理
- 先引入需要的工具库,就像准备好画画的笔、纸、颜料等 。
- 创建图形窗口,作为“画布” 。
- 要么画静态的圆形,要么通过循环、清屏、改变位置,做出小球下落(匀速、加速、反弹等)的动画效果 。
- 最后通过按键控制程序关闭,并释放窗口资源 。
这样一步步下来,就能用 C++ 画出静态圆形、做出小球下落的动画啦,从简单到复杂,慢慢就能做出更有趣的图形效果哟,就像搭积木一样,把这些知识模块组合起来,就能创造出更多好玩的动画啦!
- 1