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]