使用C中的MathGL逐点绘制三维散点图

时间:2016-01-29 16:39:10

标签: c plot particles mathgl

我正在构建一个粒子模拟,我希望在C(不是C ++!)中使用MathGL在3D散点图中将每个粒子的位置显示为一个点。我在使用C接口时遇到了问题。

到目前为止,我发现了两个有趣的例子:

  1. 一个似乎与我想要的一样的C ++示例:http://mathgl.sourceforge.net/doc_en/Dots-sample.html(但这是在C ++中,我无法找到C等价物)

  2. 这是一段C代码,用于构建带有点的3D冲浪图。

    #include <mgl2/mgl_cf.h>
    int main()
    {
            HMGL gr = mgl_create_graph(600,400);
    
            HMDT a,x,y;
            a = mgl_create_data_size(30,40,1);
            x = mgl_create_data_size(30,1,1);
            y = mgl_create_data_size(40,1,1);
            mgl_data_modify(a,"pi*(1-2*x)*exp(-4*y^2-4*(2*x-1)^2)",0);
            mgl_data_fill(x,-1.,1.,'x');
            mgl_data_fill(y,0.,1.,'x');
            mgl_rotate(gr,40.,60.,0.);
            mgl_set_light(gr,1);
            mgl_box(gr,1);
            mgl_surf_xy(gr,x,y,a,".","");
            mgl_delete_data(a);
            mgl_delete_data(y);
            mgl_delete_data(x);
    
            mgl_write_frame(gr,"test.png","");
            mgl_delete_graph(gr);
            return 0;
    }
    
  3. 示例2接近我想要做的事情,但令人讨厌的是a不是仅仅N个粒子的线性阵列。它还必须采用函数来评估a(z轴)的值,而我只是想为每个点手动传递z坐标。

    我的数据只是一维结构数组,类似于:

    struct particle {
        double x, y, z, velocity;
    };
    

    如何使用C中的MathGL将这些粒子绘制为3D(散点)图中的点?我想我必须使用mgl_dots,但它是如何从我的数组值中读取的? (我可以使用速度作为颜色编码,但这是可选的)

1 个答案:

答案 0 :(得分:0)

我使用mgl_dots是正确的,可以使用mgl_create_data_sizemgl_data_put_val准备数据,例如:

HMDT z,x,y;
int N = 1000;
x = mgl_create_data_size(N,1,1);
z = mgl_create_data_size(N,1,1);
y = mgl_create_data_size(N,1,1);

for(int i=0; i < N; i++) {
        // Set position of particle[i]
        printf("%lf\n", i/(double) N);
        mgl_data_put_val(x, i/(double) N, i, 0, 0);
        mgl_data_put_val(y, i/(double) N, i, 0, 0);
        mgl_data_put_val(z, i/(double) N, i, 0, 0);
}