在 C 中使用 MathGL 逐点绘制 3D 散点图
Draw point by point 3D scatter plot with MathGL in C
我正在构建一个粒子模拟,我想在 C(不是 C++!)中使用 MathGL 将每个粒子的位置显示为 3D 散点图中的一个点。我在使用 C 接口时遇到问题。
到目前为止我发现了两个有趣的例子:
一个似乎接近我想要的C++示例:http://mathgl.sourceforge.net/doc_en/Dots-sample.html(但这是在C++中,我一直无法找到C-equivalent)
这是一段用点构造 3D 冲浪图的 C 代码。
#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
,但它是如何从我的值数组中读取的? (我可以使用速度作为颜色编码,但这是可选的)
我用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);
}
我正在构建一个粒子模拟,我想在 C(不是 C++!)中使用 MathGL 将每个粒子的位置显示为 3D 散点图中的一个点。我在使用 C 接口时遇到问题。
到目前为止我发现了两个有趣的例子:
一个似乎接近我想要的C++示例:http://mathgl.sourceforge.net/doc_en/Dots-sample.html(但这是在C++中,我一直无法找到C-equivalent)
这是一段用点构造 3D 冲浪图的 C 代码。
#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
,但它是如何从我的值数组中读取的? (我可以使用速度作为颜色编码,但这是可选的)
我用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);
}