[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [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); } }
2.8.1 Vect sample | ||
2.8.2 Vect3 sample | ||
2.8.3 Traj sample | ||
2.8.4 Flow sample | ||
2.8.5 Pipe sample | ||
2.8.6 Dew sample |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function vect is most standard way to visualize vector fields – it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code). Vect
use color scheme for coloring (see Color scheme). The sample code is:
int sample(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); gr->SubPlot(3,2,0,""); gr->Title("Vect plot (default)"); gr->Box(); gr->Vect(a,b); gr->SubPlot(3,2,1,""); gr->Title("'.' style; '=' style"); gr->Box(); gr->Vect(a,b,"=."); gr->SubPlot(3,2,2,""); gr->Title("'f' style"); gr->Box(); gr->Vect(a,b,"f"); gr->SubPlot(3,2,3,""); gr->Title("'>' style"); gr->Box(); gr->Vect(a,b,">"); gr->SubPlot(3,2,4,""); gr->Title("'<' style"); gr->Box(); gr->Vect(a,b,"<"); mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); gr->SubPlot(3,2,5); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); gr->Vect(ex,ey,ez); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function vect3 draw just usual vector field plot but at slices of 3D data. The sample code is:
int sample(mglGraph *gr) { mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); gr->SubPlot(2,1,0); gr->Title("Vect3 sample"); gr->SetOrigin(0,0,0); gr->Rotate(50,60); gr->Axis("_xyz"); gr->Box(); gr->Vect3(ex,ey,ez,"x"); gr->Vect3(ex,ey,ez); gr->Vect3(ex,ey,ez,"z"); gr->SubPlot(2,1,1); gr->Title("'f' style"); gr->Rotate(50,60); gr->Axis("_xyz"); gr->Box(); gr->Vect3(ex,ey,ez,"fx"); gr->Vect3(ex,ey,ez,"f");gr->Vect3(ex,ey,ez,"fz"); gr->Grid3(ex,"Wx"); gr->Grid3(ex,"W"); gr->Grid3(ex,"Wz"); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function traj is 1D analogue of Vect
. It draw vectors from specified points. The sample code is:
int sample(mglGraph *gr) { mglData x,y,y1,y2; mgls_prepare1d(&y,&y1,&y2,&x); gr->SubPlot(1,1,0,""); gr->Title("Traj plot"); gr->Box(); gr->Plot(x,y); gr->Traj(x,y,y1,y2); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function flow is another standard way to visualize vector fields – it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant – you may want to use FlowP
to specify manual position of threads. Flow
use color scheme for coloring (see Color scheme). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
int sample(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)"); gr->Box(); gr->Flow(a,b); gr->SubPlot(2,2,1,""); gr->Title("'v' style"); gr->Box(); gr->Flow(a,b,"v"); gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Flow(a,b,"#"); mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); gr->Flow(ex,ey,ez); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function pipe is similar to flow but draw pipes (tubes) which radius is proportional to the amplitude of vector field. Pipe
use color scheme for coloring (see Color scheme). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
int sample(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); gr->SubPlot(2,2,0,""); gr->Title("Pipe plot (default)"); gr->Light(true); gr->Box(); gr->Pipe(a,b); gr->SubPlot(2,2,1,""); gr->Title("'i' style"); gr->Box(); gr->Pipe(a,b,"i"); gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Pipe(a,b,"#"); mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); gr->Pipe(ex,ey,ez,"",0.1); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Function dew is similar to Vect
but use drops instead of arrows. The sample code is:
int sample(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); gr->SubPlot(1,1,0,""); gr->Title("Dew plot"); gr->Box(); gr->Light(true); gr->Dew(a,b); return 0; }
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Autobuild on September 28, 2013 using texi2html 1.82.