[英]OpenGL glut animation of 8 puzzle solving
我已经使用BFS算法解决了8个难题,并将所需的移动存储到数组中,然后将这些数字转换为0,表示空白需要向上或向下移动或向左2或向右3。 我不知道如何用BFS的相应动作来动画化8个正方形以解决难题。 我知道要使用计时器以及一般如何做动画,只是不知道如何在正确的时间顺序地对正确的正方形进行动画处理。 他们总是需要在任何给定方向上移动80个像素。 如果有人能指出我正确的方向,我将不胜感激。
我不知道如何写一些东西来解决这个难题,但是却不知道如何维护一个简单的计数器来为值设置动画。
假设您的频率F
是每秒移动,而时间T
是动画开始以来的秒数。
那么,想法是,动作M
从T*F*M
M
开始,并且持续时间为1
(或更短,如果要在动作之间暂停)。
现在,您只需要一个插值函数来混合值。 线性插值(LERP)最简单,但是您可能希望样条函数在端点处加速/减速。 不管您执行什么操作,该函数仅需要一个起点,一个终点以及一个介于0和1之间的相对位置t
。
double blend( double from, double to, double t )
{
// linear interp:
return from * (t-1.0) + to * t;
}
因此,您只需通过计算小数部分fmod(T*F*M, 1.0)
来计算t
。 如果持续时间小于1
,则不要在该fmod
调用中更改1.0
。 您只需将其固定为持续时间D
,然后除以D
。
当我需要做这样的事情时,我使用一个变量来保留运动动画的剩余时间。 并且要知道要移到一边的那一块,我建议您使用具有以下结构的堆栈:
struct commands{
int piece;
int direction;
struct commands next;
};
首先,堆叠解决难题所需的所有命令,然后在设置动画时重置变量,将剩余时间保持为80,并在时间函数中:
void move_piece(int a){
//Move the piece 1 pixel to the side you want
switch(stack->direction){
//Move the piece to x+1
case 0:
piece[stack->piece].x++;
break;
//Move the piece to y+1
case 1:
piece[stack->piece].y++;
break;
case 2:...
...
}
time--;
if(time==0){
//The piece is in it's place
//Go to the next piece
time=80;
}
glutTimerFunc(20, move_piece, 0); //Change 20 to change the speed of the animation
}
这只是您如何做的一个例子。 我不知道您如何存储作品的位置,在本例中,我认为那是在结构中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.