1

配列の要素を動的に計算し、各反復後にそれらのポイントを 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);
    }

データを計算するのは関数です。

    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;
    }
4

1 に答える 1

1

「増分更新」のオプションがあります。関数を介して形状の位置バッファを変更しILShape.Positions.Update(int startColumn, int count, ILInArray<T> data)ます。これにより、ビデオ メモリの変更された部分のみが更新されるため、パフォーマンスが節約されます (ここでは OpenGL レンダラーが必要です)。

ただし、バッファは、グラフィック メモリ内の 1 つの大きなメモリ セグメントとして存在する必要があります。ボトルネックは、バッファ定義ではなく、描画にあると思われます。プロファイラーはあなたの友達です!

すべての変更後に IShape.Configure() を呼び出すことを忘れないでください。

于 2014-04-01T10:36:30.383 に答える