+2.1.3.1 Released 8 May 2013
+
+* Compatibility changes for MS VS.
+* Bugfixes for cmake options enable-double=OFF, enable-zlib=OFF.
+* Enable mouse actions for Firefox in JS sample.
+
2.1.3 Released 2 May 2013
* Functions SinFFT, CosFFT, Hankel and so on, become multi-threaded
int sample_3(mglGraph *gr);\r
int sample_d(mglGraph *gr);\r
//-----------------------------------------------------------------------------\r
-//#include <unistd.h>\r
-mglPoint pnt; // some global variable for changable data\r
+mglPoint pnt; // some global variable for changeable data\r
void *mgl_fltk_tmp(void *) { mgl_fltk_run(); return 0; }\r
//#define PTHREAD_SAMPLE\r
//-----------------------------------------------------------------------------\r
//-----------------------------------------------------------------------------\r
void save(mglGraph *gr,const char *name,const char *suf);\r
void smgl_stfa(mglGraph *gr); // STFA sample\r
+void smgl_text(mglGraph *gr); // text drawing\r
void test(mglGraph *gr)\r
{\r
+ smgl_text(gr); return;\r
+ \r
mglParse par;\r
par.AllowSetSize(true);\r
setlocale(LC_CTYPE, "");\r
snprintf(buf,128,"%s%s.jsonz",name,suf);\r
gr->WriteJSON(buf); break;\r
default:// PNG (no alpha)\r
+#if MGL_HAVE_PNG\r
snprintf(buf,128,"%s%s.png",name,suf);\r
gr->WritePNG(buf,0,false); break;\r
+#else\r
+ snprintf(buf,128,"%s%s.bmp",name,suf);\r
+ gr->WriteBMP(buf); break;\r
+#endif\r
}\r
}\r
//-----------------------------------------------------------------------------\r
#ifdef PTHREAD_SAMPLE\r
#include <pthread.h>\r
#endif\r
-mglPoint pnt; // some global variable for changable data\r
+mglPoint pnt; // some global variable for changeable data\r
void *mgl_qt_tmp(void *);\r
//-----------------------------------------------------------------------------\r
class Foo : public mglDraw\r
//-----------------------------------------------------------------------------
const char *mmgl_fexport="";
#define splot1(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(b);}
-void smgl_fexport(mglGraph *gr) // surface triangulation
+void smgl_fexport(mglGraph *gr) // test file export
{
gr->SubPlot(3,2,0);
double d,x1,x2,x0,y=0.95;
"title 'max=',b.max:norm b -1 1 on:rotate 70 60:box:surf3 b\n"
"return\n";
#define splot1(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(b);}
-void smgl_data1(mglGraph *gr) // surface triangulation
+void smgl_data1(mglGraph *gr) // basic data operations
{
mglData a(40,50,60),b; gr->Fill(a,"exp(-x^2-4*y^2-16*z^2)");
gr->Light(true); gr->Alpha(true);
"title 'max=',b.max:norm b -1 1 on:rotate 70 60:box\n"
"surf3 b 0.5:surf3 b -0.5\nreturn\n";
#define splot2(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(0.5,b);gr->Surf3(-0.5,b);}
-void smgl_data2(mglGraph *gr) // surface triangulation
+void smgl_data2(mglGraph *gr) // data transforms
{
mglData a(40,50,60),b; gr->Fill(a,"exp(-x^2-4*y^2-16*z^2)");
gr->Light(true); gr->Alpha(true);
"subplot 4 3 9:rotate 40 60:box:step x y z\n"
"subplot 4 3 10:rotate 40 60:box:torus x z 'z';light on\n"
"subplot 4 3 11:rotate 40 60:box:label x y z '%z'\n";
-void smgl_param1(mglGraph *gr) // surface triangulation
+void smgl_param1(mglGraph *gr) // 1d parametric plots
{
mglData x(100), y(100), z(100), c(100);
gr->Fill(x,"sin(pi*x)"); gr->Fill(y,"cos(pi*x)");
"subplot 4 4 13:rotate 40 60:box:boxs x y z '';meshnum 10;light on\n"
"subplot 4 4 14:rotate 40 60:box:boxs x y z '#';meshnum 10;light on\n"
"subplot 4 4 15:rotate 40 60:box:boxs x y z '@';meshnum 10;light on\n";
-void smgl_param2(mglGraph *gr) // surface triangulation
+void smgl_param2(mglGraph *gr) // 2d parametric plots
{
mglData x(100,100), y(100,100), z(100,100), c(100,100);
gr->Fill(x,"sin(pi*(x+y)/2)*cos(pi*y/2)"); gr->Fill(y,"cos(pi*(x+y)/2)*cos(pi*y/2)");
"subplot 4 3 8:rotate 40 60:box:densx c '' 0:densy c '' 0:densz c '' 0\n"
"subplot 4 3 9:rotate 40 60:box:contx c '' 0:conty c '' 0:contz c '' 0\n"
"subplot 4 3 10:rotate 40 60:box:contfx c '' 0:contfy c '' 0:contfz c '' 0\n";
-void smgl_param3(mglGraph *gr) // surface triangulation
+void smgl_param3(mglGraph *gr) // 3d parametric plots
{
mglData x(50,50,50), y(50,50,50), z(50,50,50), c(50,50,50), d(50,50,50);
gr->Fill(x,"(x+2)/3*sin(pi*y/2)"); gr->Fill(y,"(x+2)/3*cos(pi*y/2)"); gr->Fill(z,"z");
"grid3 x y z z '{r9}':grid3 x y z z '{g9}x':grid3 x y z z '{b9}z'\n"
"subplot 3 3 6:rotate 40 60:box:flow x y z ex ey ez\n"
"subplot 3 3 7:rotate 40 60:box:pipe x y z ex ey ez\n";
-void smgl_paramv(mglGraph *gr) // surface triangulation
+void smgl_paramv(mglGraph *gr) // parametric plots for vector field
{
mglData x(20,20,20), y(20,20,20), z(20,20,20), ex(20,20,20), ey(20,20,20), ez(20,20,20);
gr->Fill(x,"(x+2)/3*sin(pi*y/2)"); gr->Fill(y,"(x+2)/3*cos(pi*y/2)"); gr->Fill(z,"x+z");
/// Calculate 3D coordinate {x,y,z} for screen point {xs,ys}\r
inline mglPoint CalcXYZ(int xs, int ys)\r
{\r
- double x,y,z;\r
+ mreal x,y,z;\r
mgl_calc_xyz(gr,xs,ys,&x,&y,&z);\r
return mglPoint(x,y,z);\r
}\r
inline void Setup(bool clf_upd=true, bool showpos=false)\r
{ mgl_setup_window(gr, clf_upd, showpos); }\r
inline mglPoint LastMousePos() ///< Last mouse position\r
- { double x,y,z; mgl_get_last_mouse_pos(gr,&x,&y,&z); return mglPoint(x,y,z); }\r
+ { mreal x,y,z; mgl_get_last_mouse_pos(gr,&x,&y,&z); return mglPoint(x,y,z); }\r
};\r
//-----------------------------------------------------------------------------\r
#endif\r
}\r
//-----------------------------------------------------------------------------\r
struct MGL_NO_EXPORT mglFuncV { mglFormula *eq; char var; };\r
-mreal MGL_NO_EXPORT mgl_funcv(double v, void *par)\r
+mreal MGL_NO_EXPORT mgl_funcv(mreal v, void *par)\r
{\r
mglFuncV *f = (mglFuncV *)par;\r
mreal var[MGL_VS]; memset(var,0,('z'-'a')*sizeof(mreal));\r
#include <time.h>
#include <stdarg.h>
+#if defined(WIN32) || defined(_MSC_VER) || defined(__BORLANDC__)
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
#include "mgl2/canvas.h"
#include "mgl2/canvas_cf.h"
{
snprintf(cmd,128,"%s %s &", viewer,fname);
if(system(cmd)==-1) printf("Error to call external viewer\n");
- // sleep(2);
+ Sleep(2000);
snprintf(cmd,128,"del %s", fname);
}
else snprintf(cmd,128,"%s %s; del %s", viewer,fname,fname);
if(!dir || *dir==0) return;
long nx = d->nx, ny = d->ny, nz = d->nz;
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
- void *wt=0, *ws[mglNumThr];
+ void *wt=0, **ws=new void*[mglNumThr];
long par[4]={nx,ny,nz,strchr(dir,'i')!=0}, i;
#if MGL_USE_DOUBLE
double *a = (double *)(d->a);
mglStartThreadT(mgl_fftz,nx*ny,0,a,wt,ws,par);
}
if(wt) mgl_fft_free(wt,ws,mglNumThr);
+ delete []ws;
#if !MGL_USE_DOUBLE
for(i=0;i<nx*ny*nz;i++) d->a[i] = dual(a[2*i], a[2*i+1]);
delete []a;
long nx = re->nx, ny = re->ny, nz = re->nz;
if(nx*ny*nz != im->nx*im->ny*im->nz || !dir || dir[0]==0) return;
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
- void *wt=0, *ws[mglNumThr];
+ void *wt=0, **ws=new void*[mglNumThr];
long par[4]={nx,ny,nz,strchr(dir,'i')!=0}, i;
double *a = new double[2*nx*ny*nz];
for(i=0;i<nx*ny*nz;i++)
if(wt) mgl_fft_free(wt,ws,mglNumThr);
for(i=0;i<nx*ny*nz;i++)
{ re->a[i] = a[2*i]; im->a[i] = a[2*i+1]; }
- delete []a;
+ delete []ws; delete []a;
}
//-----------------------------------------------------------------------------
MGL_NO_EXPORT void* mgl_envx(void *par)
register long i;
long nx=d->nx,ny=d->ny,nz=d->nz,par[3]={nx,ny,nz};
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
- void *wt=0, *ws[mglNumThr];
+ void *wt=0, **ws=new void*[mglNumThr];
double *b = 0;
if(dir=='x' && nx>1)
{
}
for(i=0;i<nx*ny*nz;i++) d->a[i] = hypot(b[2*i], b[2*i+1]);
if(b) { mgl_fft_free(wt,ws,mglNumThr); delete []b; }
+ delete []ws;
}
//-----------------------------------------------------------------------------
MGL_NO_EXPORT void* mgl_stfa1(void *par)
register long i,j,k,i0,dd=dn/2;
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
double *a = new double[4*dn*mglNumThr],ff;
- void *ws[mglNumThr], *wt = mgl_fft_alloc(2*dn,ws,mglNumThr);
+ void **ws=new void*[mglNumThr], *wt = mgl_fft_alloc(2*dn,ws,mglNumThr);
long mx,my,mz;
if(dir=='y')
{
long par[5]={mx,my,mz,dn,nx};
mglStartThreadT(mgl_stfa2,my*mz,d->a,a,wt,ws,par,re,im);
}
- delete []a;
mgl_fft_free(wt,ws,mglNumThr);
+ delete []ws; delete []a;
return d;
}
//-----------------------------------------------------------------------------
if(!dir || *dir==0) return;
double *b = 0;
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
- void *wt=0, *ws[mglNumThr];
+ void *wt=0, **ws=new void*[mglNumThr];
long nx=d->nx, ny=d->ny, nz=d->nz;
long par[3]={nx,ny,nz}, i;
if(strchr(dir,'x') && nx>1)
mglStartThreadT(mgl_sinz,nx*ny,d->a,b,wt,ws,par);
}
if(b) { mgl_fft_free(wt,ws,mglNumThr); delete []b; }
+ delete []ws;
}
//-----------------------------------------------------------------------------
MGL_NO_EXPORT void* mgl_cosx(void *par)
if(!dir || *dir==0) return;
double *b = 0;
if(mglNumThr<1) mgl_set_num_thr(0); // manually set number of threads
- void *wt=0, *ws[mglNumThr];
+ void *wt=0, **ws=new void*[mglNumThr];
long nx=d->nx, ny=d->ny, nz=d->nz;
long par[3]={nx,ny,nz}, i;
if(strchr(dir,'x') && nx>1)
mglStartThreadT(mgl_cosz,nx*ny,d->a,b,wt,ws,par);
}
if(b) { mgl_fft_free(wt,ws,mglNumThr); delete []b; }
+ delete []ws;
}
//-----------------------------------------------------------------------------
HMDT MGL_EXPORT mgl_transform_a(HCDT am, HCDT ph, const char *tr)
gsl_dht_apply(dht,b,b+nx);
for(j=0;j<nx;j++) b[j] = imag(a[j+nx*i]);
gsl_dht_apply(dht,b,b+2*nx);
- for(j=0;j<nx;j++) a[j+nx*i] = dual(b[j+nx],b[j+2*nx])*mm;
+ for(j=0;j<nx;j++) a[j+nx*i] = dual(b[j+nx],b[j+2*nx])*mreal(mm);
}
return 0;
}
gsl_dht_apply(dht,b,b+ny);
for(j=0;j<ny;j++) b[j] = imag(a[i+nx*(j+ny*k)]);
gsl_dht_apply(dht,b,b+2*ny);
- for(j=0;j<ny;j++) a[i+nx*(j+ny*k)] = dual(b[j+ny],b[j+2*ny])*mm;
+ for(j=0;j<ny;j++) a[i+nx*(j+ny*k)] = dual(b[j+ny],b[j+2*ny])*mreal(mm);
}
return 0;
}
gsl_dht_apply(dht,b,b+nz);
for(j=0;j<nz;j++) b[j] = imag(a[i+j*k]);
gsl_dht_apply(dht,b,b+2*nz);
- for(j=0;j<nz;j++) a[i+j*k] = dual(b[j+nz],b[j+2*nz])*mm;
+ for(j=0;j<nz;j++) a[i+j*k] = dual(b[j+nz],b[j+2*nz])*mreal(mm);
}
return 0;
}
{
for(j=0;j<nx;j++) b[j] = a[j+nx*i];
gsl_dht_apply(dht,b,b+nx);
- for(j=0;j<nx;j++) a[j+nx*i] = b[j+nx]*mm;
+ for(j=0;j<nx;j++) a[j+nx*i] = b[j+nx]*mreal(mm);
}
return 0;
}
i = ii%nx; k = ii/nx;
for(j=0;j<ny;j++) b[j] = a[i+nx*(j+ny*k)];
gsl_dht_apply(dht,b,b+ny);
- for(j=0;j<ny;j++)a[i+nx*(j+ny*k)] = b[j+ny]*mm;
+ for(j=0;j<ny;j++)a[i+nx*(j+ny*k)] = b[j+ny]*mreal(mm);
}
return 0;
}
{
for(j=0;j<nz;j++) b[j] = a[i+j*k];
gsl_dht_apply(dht,b,b+nz);
- for(j=0;j<nz;j++) a[i+j*k] = b[j+nz]*mm;
+ for(j=0;j<nz;j++) a[i+j*k] = b[j+nz]*mreal(mm);
}
return 0;
}
register long i,j,ch,retVal;\r
fp = gzopen(fname,"r"); if(!fp) return false; // false if no file\r
// first string is comment (not used), second string have information\r
- if(!gzgets(fp,str,256) || !gzgets(fp,str,256))\r
+ if(!gzgets(fp,str,256) || strncmp(str,"# font",6) || !gzgets(fp,str,256))\r
{ gzclose(fp); return false; }\r
retVal = sscanf(str, "%d%f%d", &n, ff, &s);\r
//Check sscanf read all data (3 items)\r
\r
fp = gzopen(fname,"r"); if(!fp) return false; // this font must be in any case\r
// first string is comment (not used), second string have information\r
- if(!gzgets(fp,str,256) || !gzgets(fp,str,256))\r
+ if(!gzgets(fp,str,256) || strncmp(str,"# font",6) || !gzgets(fp,str,256))\r
{ gzclose(fp); return false; }\r
sscanf(str, "%u%f%u", &numg, fact, &s);\r
fact[1] = fact[2] = fact[3] = fact[0]; // copy default factor for other font styles;\r
- Buf = (short *)malloc(s*sizeof(short)); // prealocate buffer\r
+ Buf = (short *)malloc(s*sizeof(short)); // preallocate buffer\r
memset(Buf,0,s*sizeof(short));\r
if(!Buf) { gzclose(fp); numg=0; return false; }\r
// now allocate memory for all fonts\r
if(tmax<dt) return res; // nothing to do\r
int nt = int(tmax/dt)+1;\r
mgl_data_create(res,n,nt,1);\r
- mreal x[n], k1[n], k2[n], k3[n], v[n], hh=dt/2;\r
+ mreal *x=new mreal[n], *k1=new mreal[n], *k2=new mreal[n], *k3=new mreal[n], *v=new mreal[n], hh=dt/2;\r
register long i,k;\r
// initial conditions\r
for(i=0;i<n;i++) x[i] = res->a[i] = x0[i];\r
func(v,k2,par);\r
for(i=0;i<n;i++) res->a[i+n*k] = x[i] += (k1[i]+k2[i]+2*k3[i])*dt/6;\r
}\r
+ delete []x; delete []k1; delete []k2; delete []k3; delete []v;\r
return res;\r
}\r
//-----------------------------------------------------------------------------\r
{\r
dual *hxy, *huv, *hxv, *huy, *a;\r
dual *hx, *hy, *hu, *hv, h0;\r
- double *dmp;\r
+ mreal *dmp;\r
mreal *r, dr, dk;\r
mgl_ap *ra;\r
dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par);\r
<p>You can use mouse with pressed left button for rotation; with pressed middle button for shift; mouse wheel for zoom in/out. Double click will restore original view.</p>
<center>
<canvas id="canvas" width="800" height="600"
- style="border:1px solid #d3d3d3;" onmousemove="mglMouseMove()"
- onmousedown="mglMouseDown()" onmouseup="mglMouseUp()"
- onmouseout="mglMouseUp()" onmousewheel="mglMouseWheel()"
- ondblclick="mglRestore()"></canvas>
+ style="border:1px solid #d3d3d3;" onmousemove="mglMouseMove(event)"
+ onmousedown="mglMouseDown(event)" onmouseup="mglMouseUp(event)"
+ onmouseout="mglMouseUp(event)" onmousewheel="mglMouseWheel(event)"
+ ondblclick="mglRestore(event)"></canvas>
</center>
<p id="time"></p>
{ obj.button = 0; obj.good = 0;
ctx.clearRect(0,0,obj.width,obj.height);
mgl_draw_good(obj, ctx); }
-var mglMouseDown = function()
+var mglMouseDown = function(event)
{
obj.good = 1;
- obj.mouseX = window.event.clientX;
- obj.mouseY = window.event.clientY;
- obj.button = window.event.button+1;
+ obj.mouseX = event.clientX;
+ obj.mouseY = event.clientY;
+ obj.button = event.button+1;
}
-var mglMouseMove = function()
+var mglMouseMove = function(event)
{
- var x = window.event.clientX-obj.mouseX;
- var y = window.event.clientY-obj.mouseY;
+ var x = event.clientX-obj.mouseX;
+ var y = event.clientY-obj.mouseY;
switch(obj.button)
{
case 1: // rotate
mgl_draw(obj, ctx);
}
}
-var mglMouseWheel = function()
+var mglMouseWheel = function(event)
{
- var e = window.event;
- var d = e.wheelDelta? e.wheelDelta:e.detail*(-120);
-
-/* var x = window.event.clientX;
- var y = obj.height-window.event.clientY;
- mgl_shift_down(obj, -y/obj.height);
- mgl_shift_right(obj, x/obj.width);*/
-
+// var e = window.event;
+ var d = event.wheelDelta? event.wheelDelta:event.detail*(-120);
mgl_zoom_in(obj, Math.pow(1.002,d));
mgl_draw(obj, ctx);
}
15. Check samples: colorbar
16. Add samples about data handling (data1, data2, data2)
+17. Add "Triangulation sample"
20. JS rotation in Firefox
23. check if all "value" options are described