我应该编写一个代码,模拟在墙壁和半圆(半径30,中心@(50,0))内反弹的非弹性粒子。每次撞击墙壁,粒子都会损失其原始速度的3%和/或半圆。
我也在使用graphics.h库
我已经制作了大部分程序,但是粒子不能在半圆上正确弹回。
我使用了反射矩阵:
\ begin {bmatrix} cos 2 \ theta和sin2 \ theta \ sin2 \ theta和-cos2 \ theta \ end {bmatrix}
下面是这段代码片段,其中包含粒子撞击半圆时的条件:
//initial conditions
x = 0;
y = 100;
Vx = 15.0;
Vy = 0.0;
double dt = 0.0001; //initial time step and increment
for(double t = 0; t < 50; t += dt)
{
Vy = Vy + grav*dt;
//Conditions when the particle hits a wall or the floor and retaining only 97% of its speed
if (y<0.0)
{
Vy = -Vy + grav*dt;
}
if(x >100.0 || x < 0.0)
{
Vx = -Vx;
}
//condition when the particle hits the semicircle
//semicircle equation: y = sqrt(30^2 - (x-50)^2)
if(y < sqrt((30*30)-((x-50)*(x-50))) )
{
Vxnew = ((Vx)*(cos(2.0*theta)) + (Vy*(sin(2.0*theta))));
Vy = (Vy*(cos(2.0*theta)) - ((Vx)*(sin(2.0*theta))));
Vx = Vxnew;
}
x = x + Vx*dt;
y = y + Vy*dt;
putpixel(conx(x), cony(y), 15);
}
我不确定该反射矩阵是否适用于曲面,我应该使用其他方法还是实现错误?
对于损失速度部分,我可能只需将新的x和y速度乘以0.97。
对于上下文,我制作的此函数将循环中的计算值转换为像素值
//convert to pixel value (scale of 6)
double conx(double x)
{
return x * (600/100) + 50;
}
double cony(double y)
{
return -y * (600/100) + 650;
}