RE: Real Time Animation
- To: mathgroup at smc.vnet.net
- Subject: [mg36890] RE: [mg36796] Real Time Animation
- From: Goyder Dr HGD <H.Goyder at rmcs.cranfield.ac.uk>
- Date: Tue, 1 Oct 2002 04:45:14 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Many thanks to all who replied. The original problem was as follows: In a presentation I wish to use Plot to generate a sequence of frames and then animate them. The problem is that the audience sees the animation twice. Once when the frames are being generated and then again after I have closed the group and double clicked on the top graphic. However, the first showing during generation is enough (but uncontrolled). Is it possible to tidy up the generation of the graphic so that it becomes the animation? There were two main solutions which I now apply to my real problem and not the simple, generic, problem in the original post. The real problem was how to build up a probably density function (PDF) in real time. In the examples below I redraw the PDF every time I add 10 points. Initialise <<Statistics`ContinuousDistributions`; <<Statistics`DataManipulation`; <<Graphics`Graphics`; << JLink`; wb=WeibullDistribution[2.101349094155377,22.58126779173235`]; midpts=Table[i,{i,0.5,50,1}]; Solution from Omega Consulting GraphicCell[graphics_] := Cell[GraphicsData["PostScript", DisplayString[graphics]],"Graphics"] Block[{$DisplayFunction=Identity, graphs}, data={}; graphs = Table[data=Flatten[Join[data,RandomArray[wb,10]]]; freq=BinCounts[data,{0,50,1}]; GraphicCell[ BarChart[Transpose[{freq,midpts}],ImageSize ->500] ], {500}]; NotebookWrite[EvaluationNotebook[],Cell[CellGroupData[graphs,Closed]]]; SelectionMove[EvaluationNotebook[], All, GeneratedCell]; FrontEndExecute[{FrontEndToken[EvaluationNotebook[], "SelectionAnimate"]}] ] This solution works but it generates 500 frames and sometimes exceeds the memory. The paradigm here is generate all frames, then animate all frames. We really need a loop that does: generate next frame, delete last frame, show next frame Is it possible to do this? Bobby Treat also offered a solution involving SelectionMove. The second solution was from Jerry Blimbaum and uses JAVA InstallJava[]; UseFrontEndForRendering = False; createWindow[] := Module[{frame}, frame = JavaNew["com.wolfram.jlink.MathFrame", "Probability Density Function"]; drawArea = JavaNew["com.wolfram.jlink.MathCanvas"]; drawArea@setUsesFE[UseFrontEndForRendering]; drawArea@setSize[800, 600]; JavaBlock[frame@setLayout[JavaNew["java.awt.BorderLayout"]]; frame@add[drawArea, ReturnAsJavaObject[BorderLayout`CENTER]]; frame@pack[]; frame@setSize[800, 600]; frame@setLocation[100, 100]; JavaShow[frame]]; frame ] ClearAll[drawString]; drawString[] :=( data=Flatten[Join[data,RandomArray[wb,10]]]; freq=BinCounts[data,{0,50,1}]; BarChart[Transpose[{freq,midpts}],ImageSize ->500, DisplayFunction -> Identity]) LoadJavaClass["java.lang.Thread"]; AnimationPlot[n_] := JavaBlock[ Block[{frm}, frm = createWindow[]; Do[(obj = drawString[]; drawArea@setMathCommand["obj"]; drawArea@repaintNow[]; Thread@sleep[];) ,{n} ]]] data={}; AnimationPlot[500]; This solution works and does not use significant memory. However, we have not managed to control the speed of this animation. The JAVA code sleep does not work nor does the use of a Mathematica Pause which always rounds up to an integer (is this a bug?). Hugh Goyder