/* SWILL Mandelbrot example */ #include "swill.h" #include "gd.h" /* Structure containing plot data */ typedef struct { double Xmin; double Xmax; double Ymin; double Ymax; int Tolerance; gdImagePtr im; } MandelData; /* Handler function that draws an image */ void mandel(FILE *f, MandelData *m) { double scalingx; double scalingy; double zr,zi,ztr,zti,cr,ci; double cscale; int i,j,n; scalingx = (m->Xmax-m->Xmin)/m->im->sx; scalingy = (m->Ymax-m->Ymin)/m->im->sy; cscale = 256.0/m->Tolerance; for (i = 0; i < m->im->sx; i++) { for (j = 0; j < m->im->sy; j++) { zr = scalingx*i + m->Xmin; zi = scalingy*j + m->Ymin; cr = zr; ci = zi; n = 0; while (n < m->Tolerance) { ztr = zr*zr-zi*zi + cr; zti = 2*zr*zi + ci; zr = ztr; zi = zti; if (ztr*ztr + zti*zti > 20) break; n = n + 1; } if (n >= m->Tolerance) gdImageSetPixel(m->im,i,j,0); else gdImageSetPixel(m->im,i,j,(int) (n*cscale)); } } gdImagePng(m->im,f); } /* Handler that produces HTML form for changing values */ void mandelpage(FILE *f, MandelData *m) { double xmin, xmax, ymin, ymax; double xshift,yshift; int tol; fprintf(f,"
\n"); if (!swill_getargs("d(xmin)d(xmax)d(ymin)d(ymax)i(tol)", &xmin,&xmax,&ymin,&ymax,&tol)) { fprintf(f,"Missing form variable!\n"); } else { m->Xmin = xmin; m->Xmax = xmax; m->Ymin = ymin; m->Ymax = ymax; m->Tolerance = tol; } /* Link to image picture */ fprintf(f,"\n"); fprintf(f,"Xmin-xshift,m->Xmax-xshift,m->Ymin,m->Ymax,m->Tolerance); fprintf(f,"\">[ Left ]"); fprintf(f,"Xmin+xshift,m->Xmax+xshift,m->Ymin,m->Ymax,m->Tolerance); fprintf(f,"\">[ Right ]"); fprintf(f,"Xmin,m->Xmax,m->Ymin-yshift,m->Ymax-yshift,m->Tolerance); fprintf(f,"\">[ Up ]"); fprintf(f,"Xmin,m->Xmax,m->Ymin+yshift,m->Ymax+yshift,m->Tolerance); fprintf(f,"\">[ Down ]"); fprintf(f,"Xmin+xshift,m->Xmax-xshift,m->Ymin+yshift,m->Ymax-yshift,m->Tolerance); fprintf(f,"\">[ Zoom in ]"); fprintf(f,"Xmin-xshift,m->Xmax+xshift,m->Ymin-yshift,m->Ymax+yshift,m->Tolerance); fprintf(f,"\">[ Zoom out ]"); fprintf(f,"