很多时候,我发现我需要一个软件来创建简单的教育动画。在这些动画中,我想逐一画一系列简单的动画。
例如,我想展示一个n皇后问题的回溯算法是如何工作的。在这种情况下,我想画一个棋盘,在左上角的正方形上画一个皇后,然后在它旁边的正方形上画另一个皇后,然后第二个皇后向下画,直到它没有受到第一个皇后的威胁,然后添加第三个皇后等等。参见此页,例如java applet。
我试着用我在网络上找到的免费的可视化框架来编写这些程序,比如processing.org和各种HTML-画布包装,但是我所缺少的主要东西是一个可以根据我的命令显示/指导动画的对象。
例如,在处理过程中,如果我创建了一个名为" queen“的对象,该对象应该被绘制到屏幕上并像皇后那样移动。我不得不照顾自己:
因此,我不得不在主循环中编写表单的代码:
def mainloop():
for obj in DrawableObjects: obj.draw()
def onclick(e):
for obj in ResponsiveObjects: obj.handleClick(e)
这是丑陋和重复!
我希望有一个动画框架,允许我使用自动绘制到屏幕上的对象(假设我将为它们定义z轴,解决交叉问题),如果我愿意的话,它将自动响应用户的交互。我想象的框架的一个示例代码是:
class queen(DrawableObject):
def __init__(self,boardX,boardY):
self.boardX,self.boardY = boardX,boardY
self.x = square_width*x+square_width/2
self.y = square_height*y+square_height/2
def draw(self):
circle(x,y,radius)
def move(self,direction_x,direction_y,squares):
if direction_x
#this would move the queen slowly to the desired direction
self.boardX += direction_x*squares
if self.boardX < 0:
self.boardX = 0
return
#ditto for y
...
#Let's pretend this function is blocking
self.animated_transpose(
direction_x*squares*square_width,
direction_y*squares*squre_height
)
def delete(self):
self.fadeOut()
当动画皇后,我将简单地创建一个新的皇后,并使用移动功能来移动它周围,而不担心太多的担心什么时候和地点把它。这个框架应该能帮我解决这个问题。这就是:
def main():
queens = []
for i in range(8): queens.append(Queen(0,i))
# find a solution by stupid random walk
steps = 0
while queens_threats_one_another(queens):
queens[rand(8)].move(choose([-1,1],0,1)
step += 1
write_to_screen("did it with %d steps"%steps)
该框架还提供了其他一些很好的功能,这将是对网络友好的。也就是说,javascript、flash或Java。而且它是免费的。
这种(或类似的)框架是否存在?
发布于 2009-07-12 18:22:08
因为Flash的显示架构是基于对象的,所以它似乎非常适合于这类事情。也有许多动画库的Flash,使这种事情非常容易。
例如,假设您定义了一个Queen类,它扩展了内置的Sprite类。使用TweenLite库,在2秒钟内创建和移动皇后的代码如下所示:
var queen:Queen = new Queen();
queen.x = 100; // based on pixels, but you could easily create a square-to-pixel conversion
queen.y = 100;
addChild(queen); // assuming this code is in another DisplayObject, such as the stage
TweenLite.to(queen, 2, {x:200, y:300});
https://stackoverflow.com/questions/1116873
复制相似问题