Next: Hints, Previous: 3D samples, Up: Examples [Contents][Index]
Vector field visualization (especially in 3d case) is more or less complex task. MathGL provides 3 general types of plots: vector field itself (Vect), flow threads (Flow), and flow pipes with radius proportional to field amplitude (Pipe).
However, the plot may look tangly – there are too many overlapping lines. I may suggest 2 ways to solve this problem. The first one is to change SetMeshNum for decreasing the number of hachures. The second way is to use the flow thread chart Flow, or possible many flow thread from manual position (FlowP). Unfortunately, I don’t know any other methods to visualize 3d vector field. If you know any, e-mail me and I shall add it to MathGL.
Most of samples will use the same data for plotting. So, I put its initialization in separate function
void mgls_prepare2v(mglData *a, mglData *b)
{
register long i,j,n=20,m=30,i0;
if(a) a->Create(n,m); if(b) b->Create(n,m);
mreal x,y;
for(i=0;i<n;i++) for(j=0;j<m;j++)
{
x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
if(a) a->a[i0] = 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y);
if(b) b->a[i0] = 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y);
}
}
void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez)
{
register long i,j,k,n=10,i0;
if(!ex || !ey || !ez) return;
ex->Create(n,n,n); ey->Create(n,n,n); ez->Create(n,n,n);
mreal x,y,z, r1,r2;
for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++)
{
x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
ex->a[i0]=0.2*x/r1 - 0.2*x/r2;
ey->a[i0]=0.2*y/r1 - 0.2*y/r2;
ez->a[i0]=0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2;
}
}
or using C functions
void mgls_prepare2v(HMDT a, HMDT b)
{
register long i,j,n=20,m=30,i0;
if(a) mgl_data_create(a,n,m,1);
if(b) mgl_data_create(b,n,m,1);
mreal x,y;
for(i=0;i<n;i++) for(j=0;j<m;j++)
{
x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
if(a) mgl_data_set_value(a, 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
if(b) mgl_data_set_value(b, 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
}
}
void mgls_prepare3v(HMDT ex, HMDT ey, HMDT ez)
{
register long i,j,k,n=10,i0;
if(!ex || !ey || !ez) return;
mgl_data_create(ex,n,n,n);
mgl_data_create(ey,n,n,n);
mgl_data_create(ez,n,n,n);
mreal x,y,z, r1,r2;
for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++)
{
x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
mgl_data_set_value(ex, 0.2*x/r1 - 0.2*x/r2, i,j,k);
mgl_data_set_value(ey, 0.2*y/r1 - 0.2*y/r2, i,j,k);
mgl_data_set_value(ez, 0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2, i,j,k);
}
}
| • Vect sample: | ||
| • Vect3 sample: | ||
| • Traj sample: | ||
| • Flow sample: | ||
| • Pipe sample: | ||
| • Dew sample: |
Next: Hints, Previous: 3D samples, Up: Examples [Contents][Index]