我正在构建一个粒子模拟,我希望在C(不是C ++!)中使用MathGL在3D散点图中将每个粒子的位置显示为一个点。我在使用C接口时遇到了问题。
到目前为止,我发现了两个有趣的例子:
一个似乎与我想要的一样的C ++示例:http://mathgl.sourceforge.net/doc_en/Dots-sample.html(但这是在C ++中,我无法找到C等价物)
这是一段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;
}
示例2接近我想要做的事情,但令人讨厌的是a
不是仅仅N个粒子的线性阵列。它还必须采用函数来评估a
(z轴)的值,而我只是想为每个点手动传递z坐标。
我的数据只是一维结构数组,类似于:
struct particle {
double x, y, z, velocity;
};
如何使用C中的MathGL将这些粒子绘制为3D(散点)图中的点?我想我必须使用mgl_dots
,但它是如何从我的数组值中读取的? (我可以使用速度作为颜色编码,但这是可选的)
答案 0 :(得分:0)
我使用mgl_dots
是正确的,可以使用mgl_create_data_size
和mgl_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);
}