ILNumeric连续渲染图

时间:2014-01-16 21:28:17

标签: render graphing ilnumerics

有没有办法连续绘制更改数组数据?我有一个ILLinePlot来绘制线条以改变按钮事件的数据,但我想让它连续。

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不会更新。我想也许是因为这个无限循环无法访问主循环,所以我把它放在自己的线程中,但它仍然没有像我希望的那样渲染......

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我认为你需要在修改形状或其缓冲区后调用Configure()。使用BeginRenderFrame事件进行修改,不应添加无限多个形状/新场景。重用它们会更好!

请告诉我,如果您需要一个例子......