我正在尝试在矩阵上弹起一个球。我试过实现两种算法,但似乎都有优点和缺点。经过一番搜索,我无法找到更好的算法的进一步阅读材料。
谁能知道我在做什么或搜索!谢谢你。
(为了方便,我目前只在一维中实现了这个)
第一个方法有一个速度,我们把它加到y上,这产生了一个很好的结果,但是我们跳过了像素,使它看起来跳跃。
while(true){
effects.leds[XY(x,y)] = CRGB(0,0,0);//remove old ball
y = y + (int)round(yd);//move ball
yd = yd - gravity;//apply some gravity
if(y<1)//check ball hitting the ground
yd = 0.8 * -yd;//make xd a positive number and take some energy off it.
if(y< 3 && fabs(yd)<1)//give the ball some momentum (its now resting on the floor).
yd = random(0,5);
if(y < 0)//if the ball went too low
y = 0;
if(x>-1 && x<64 && y>-1 && y<64)//check ball is within our matrix and then draw
effects.leds[XY(x,y)] = CRGB(255,255,255);
delay(10);
}
第二个算法希望在第一个算法的基础上改进,它不那么跳跃,但看起来非常不自然!
while(true)
{
effects.leds[XY(x,y)] = CRGB(0,0,0); //remove oldball.
if(yd > 1)//move the ball higher or lower
y = y + 1;
else
y = y - 1;
yd = yd - gravity; //apply some gravity
if(y<1)//check ball hitting the ground
yd = 0.8 * -yd;//make xd a positive number and take some energy off it.
if(y< 3 && fabs(yd)<1)//give the ball some momentum (its now resting on the floor).
yd = random(0,5);
if(y < 0)
y = 0;
//check ball is within our matrix and then draw
if(x>-1 && x<64 && y>-1 && y<64)
effects.leds[XY(x,y)] = CRGB(255,255,255);
if(yd*yd < 40)
delay(40 - yd*yd);
}
p。S你可以假设绘图是立即发生的,如果你感兴趣的话,我正在使用带有ESP32的pxmatrix
。
谢谢。
我会这样做(只是想法-不是实际的c++代码)
y = START_HEIGHT
v = START_VELOCITY
a = G(-9.1) // const
loop:
v += G * dt
dy = v * dt - v * AIR_RESISTENCE
y += dy
if (y < 0) {
v = -v * ENGERGY_LOST_ON_ELASTIC_JUMP(0.94)
y += abs(dy) - y
}
go to loop