2014-01-16 55 views
4

有沒有辦法連續繪製改變陣列數據?我有一個ILLinePlot來繪製線條,以改變按鈕事件上的數據,但是我想讓它連續。ILNumeric連續渲染圖

while (true) 
{ 
    float[] RefArray = A.GetArrayForWrite(); 
    //RefArray[0] = 100; 
    Shuffle<float>(ref RefArray); 
    Console.Write(A.ToString()); 
    scene = new ILScene(); 
    pc = scene.Add(new ILPlotCube()); 
    linePlot = pc.Add(new ILLinePlot(A.T, lineColor: Color.Green)); 
    ilPanel1.Scene = scene; 
    ilPanel1.Invalidate(); 

} 

我遇到的問題是,循環運行,我可以看到數組的更新,但ILPanel不更新。我想也許這是因爲主循環無法訪問,由於這個無限循環,所以我把它放在它自己的線程中,但它仍然沒有渲染,因爲我希望...

回答

4

正如保羅指出,有一個更有效的嘗試做到這一點:

private void ilPanel1_Load(object sender, EventArgs e) { 
    using (ILScope.Enter()) { 
     // create some test data 
     ILArray<float> A = ILMath.tosingle(ILMath.rand(1, 50)); 
     // add a plot cube and a line plot (with markers) 
     ilPanel1.Scene.Add(new ILPlotCube(){ 
      new ILLinePlot(A, markerStyle: MarkerStyle.Rectangle) 
     }); 
     // register update event 
     ilPanel1.BeginRenderFrame += (o, args) => 
     { 
      // use a scope for automatic memory cleanup 
      using (ILScope.Enter()) { 
       // fetch the existint line plot object 
       var linePlot = ilPanel1.Scene.First<ILLinePlot>(); 
       // fetch the current positions 
       var posBuffer = linePlot.Line.Positions; 
       ILArray<float> data = posBuffer.Storage; 
       // add a random offset 
       data = data + ILMath.tosingle(ILMath.randn(1, posBuffer.DataCount) * 0.005f); 
       // update the positions of the line plot 
       linePlot.Line.Positions.Update(data); 
       // fit the line plot inside the plot cube limits 
       ilPanel1.Scene.First<ILPlotCube>().Reset(); 
       // inform the scene to take the update 
       linePlot.Configure(); 
      } 
     }; 
     // start the infinite rendering loop 
     ilPanel1.Clock.Running = true; 
    } 
} 

這裏,完全更新運行在一個匿名函數中,註冊爲BeginRenderFrame

場景對象被重用,而不是在每個渲染幀中重新創建。在更新結束時,場景需要知道,通過在受影響的節點或其父節點中的某個節點上調用Configure完成。這可以防止場景渲染部分更新。

使用ILNumerics arteficial作用域以便在每次更新後進行清理。一旦涉及更大的陣列,這是特別有利的。我添加了對ilPanel1.Scene.First<ILPlotCube>().Reset()的調用,以重新調整繪圖立方體對新數據內容的限制。

最後,通過啓動ILPanel的Clock來啓動渲染循環。

結果是一個動態線條圖,在每個渲染幀處進行更新。

enter image description here

2

我想你需要在修改形狀或其緩衝區後調用Configure()。使用BeginRenderFrame事件進行修改,並且不應添加無限多個形狀/新場景。重用它們會更好!

讓我知道,如果你需要一個例子...