【问题标题】:How to dynamically add points on the ILNumerics form?如何在 ILNumerics 表单上动态添加点?
【发布时间】:2014-04-01 18:36:30
【问题描述】:

我想动态计算 Array 的元素,并在每次迭代后将这些点放在 ILNumerics 表单上。可能吗?

更新:

这是我的代码。

初始化N:

 private const int N = 20000000;

这是一个将数据存储在数组中然后将其发送到名为“Draw”的函数的函数

        public void Calc()
    {
        float o = (float) Math.PI/6;
        float lambda;
        const float hLambda = 0.02f;
         const float hAlpha = 0.02f;
        float alpha = (float) Math.PI/36;
        float[,] a;
        int i = 0;
        a = new float[N, 3];
            for (alpha = (float) 0; alpha < 6.2832; alpha += hAlpha)
                for (lambda = -1.8f; lambda <= 1.8f; lambda += hLambda)
                    for (var j = 0; j < 1000; j++)
                {
                    float xPaint = X_Sphere(lambda, o, alpha);
                    float yPaint = Y_Sphere(lambda, o, alpha);
                    float zPaint = Z_Sphere(lambda, o, alpha);


                    if (j > 900)
                    {
                        a[i, 0] = zPaint;
                        a[i, 1] = yPaint;
                        a[i, 2] = xPaint;
                        i++;
                    }
                    o = Calculate(o, lambda, alpha);
                }

            Draw(a, false);
    }

是functon,计算数据:

    public float Calculate(float o, float lambda, float alpha)
    {
        return (float) (lambda*Math.Sin(o + alpha));
    }

我将坐标从球面坐标转换为笛卡尔坐标:

    public float X_Sphere(float r, float tetta, float a)
    {
        return (float) (r*Math.Sin(tetta)*Math.Cos(a));
    }

    public float Y_Sphere(float r, float tetta, float a)
    {
        return (float) (r*Math.Sin(tetta)*Math.Sin(a));
    }

    public float Z_Sphere(float r, float tetta, float a)
    {
        return (float) (r*Math.Cos(tetta));
    }

    private void Draw(float[,] obj, bool twodMode)
    {
        var cm = new ILColormap(Colormaps.Jet); 

        var scene = new ILScene();
        var pc = new ILPlotCube();
        var points = new ILPoints();
        points.Positions = obj;
        points.Size = 1f;
        ILArray<float> Z = ILSpecialData.sincf(10000000, 3, 4);
        var cmap = new ILColormap(Colormaps.Jet);
        points.Colors = cmap.Map(Z).T;
        points.Color = null;
        pc.TwoDMode = false;
        scene.Add(pc);
        pc.Add(points);
        pc.AllowRotation = true;
        pc.AllowZoom = true;
        scene.Screen.First<ILLabel>().Visible = false;
        ilPanel1.Scene = scene;
    }

【问题讨论】:

  • 到目前为止你取得了什么成就?您可以创建动态图。这很容易,但取决于要生成的情节类型。
  • 我更新了我的帖子。目前我正在计算我需要的数据,而不是通过 ILNumerics 绘制它。但有一个问题。我需要绘制大量的点,所以我在想,也许我可以动态地绘制它?我的意思是: - 画一个点 - 覆盖它 - 画另一个(并通过这种方法在屏幕上显示所有点?)因为它目前对记忆很有用。你能帮帮我吗?
  • 嘿,海默?你还在吗?
  • 当然。你的例子太复杂了。通过使用 ILNumerics 数组和 ILMath 方法而不是 System.Array,整个算法可能会大大减少。但我猜唯一相关的部分是 Draw 函数。请参阅下面的答案..

标签: .net plot drawing ilnumerics


【解决方案1】:

有一个“增量更新”选项。您可以通过ILShape.Positions.Update(int startColumn, int count, ILInArray&lt;T&gt; data) 函数修改形状的位置缓冲区。这通过仅更新视频内存的修改部分来节省性能(此处期望 OpenGL 渲染器)。

但是,缓冲区必须作为图形内存中的一个大内存段存在。我怀疑瓶颈更多在于绘图,而不是缓冲区定义。分析器是您的朋友!

不要忘记在所有修改后调用 ILShape.Configure() !

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多