pltrace
traces an (implicit) 2-dimensional function
parameter | type | units | description |
---|---|---|---|
ident | char* | -- | marker to be plotted with the curve |
func(float,float) | float* | uu | function of x and y to be traced |
xmin,ymin,xmax,ymax | float | uu | in this window |
resol | float | % | resolution relative to visible field, default 0 = 1% |
grid | float | % | search grid's line distance relative to visible field, default 0 = 1% |
linetype | int | -- | see plot |
returns: | void |
Description
pltrace traces a function in the rectangle xmin,ymin,xmax,ymax. For example: func(x,y) = x2 + y2 - 25 plots a circle with a radius of 5 user units and the centre at the origin. But, of course, pltrace is not the most efficient method for plotting a circle. resol is the resolution of the plot in mm, that is: the curve will be plotted in steps of resol mm long. It can not be set to less than 0.05 mm. grid is the line-distance of an imaginary grid placed over the plotting area. It is used for searching starting points of (sub)curves. If a (sub)curve happens to lie completely within a ``pixel'' of the grid, then it will not be found.Examples
The program pltrace1.c plots the function f(x,y)=x2+y2-cos(18x)-cos(18y) By adjusting FIRST, LAST and STEP you can easily adapt it to plot other cross-sections above and below the plane of the paper.// pltrace1 - traces contours of the function: // f(x,y)=x2+y2-cos(18x)-cos(18y) #include <stdlib.h> #include <math.h> #include <simplot.h> #define RESOL .3 #define GRID 2 #define FIRST -2 #define LAST 2 #define STEP .5 float z; float func(float x,float y) { float r = x*x+y*y-cos(18*x)-cos(18*y)-z; return r; } int main() { extern float func(float,float); plinit(PS,"pltrace1",A4,30,30,"",""); plaxes(-1,-1,1,1,150,150,"x","y", "f(x,y)=x2^+y2^-cos(18x)-cos(18y)"); plrect(-1,-1,1,1); for (z=FIRST;z<=LAST;z+=STEP) { if (z<-0.1) plcolor(Red); else if (z>0.1) plcolor(Blue); else plcolor(Black); pltrace("",func,-1,-1,1,1,RESOL,GRID,DOWN); } plframe(5,3); exit(0); }
// pltrace2 - traces contours of the function: // sin(15*sin(x)) sin(30*sin(y)) // (-------------- + .25) * -------------- * 150 // 15*sin(x) 30*sin(y) #include <string.h> #include <stdlib.h> #include <math.h> #include <simplot.h> #define XMIN -50 #define YMIN -50 #define XMAX +50 #define YMAX +50 #define XL 150 #define YL 150 #define RESOL .3 #define GRID 2 float z; float efsin(float xx,float yy) { float x,y; x = 15*sin(xx*M_PI/180); if (fabs(x)<.1) x = .1; y = 30*sin(yy*M_PI/180); if (fabs(y)<.1) y = .1; return (sin(x)/x+.25)*sin(y)/y*150-z; } int main() { char ident[2]=" "; extern float efsin(float,float); int i; plinit(PS,"pltrace2",A4,30,30,"",""); plaxes(XMIN,YMIN,XMAX,YMAX,XL,YL,"x","y", "Z=[sin(15sinX)/(15sinX)+.25] sin(30sinY)/(30sinY)*150"); plrect(XMIN,YMIN,XMAX,YMAX); plset(OPAQUETEXT,TRUE); for (i=0,z=1;i<=8;i++) { ident[0]=i+'1'; pltrace(ident,efsin,XMIN,YMIN,XMAX,YMAX,RESOL,GRID,DOWN); z *= 2; } plframe(5,3); plend(); exit(0); }
// __________ pltrace3 __________ // plotting functions with pltrace // each curve is placed in a separate square frame // features: distribution of plots over the plot-page with plreserv // use of plframe and plclip float a,b,asq,bsq; #include <values.h> #include <string.h> #include <simplot.h> #include <math.h> #define S(x) ((x)*(x)) float snail (float x,float y) { return S(x*x+y*y-a*x)-bsq*(x*x+y*y); } float cassin(float x,float y) { return S(x*x+y*y+asq)-4*asq*x*x-bsq*bsq; } float folium(float x,float y) { return x*x*x+y*y*y-3*a*x*y; } float astrid(float x,float y) { return pow((x*x),.333333)+pow((y*y),.333333)-pow((a*a),.333333); } float concho(float x,float y) { return S(y-a) * (x*x+y*y)-bsq*y*y; } float sinus (float x,float y) { return y-a*sin(b*x); } void curve(float (*func)(float,float),float p,float q,char *name,char *form) { a=p; b=q; asq=a*a; bsq=b*b; plframe(-1,0); plreserv(55,50,85); plu(0,0); pld(0,0); plframe(30,2); //box around origin plu(0,-35); plformat(0,-.5,"%s\n%s\na=%g b=%g",name,form,a,b); pltrace("",func,-30,-30,30,30,0,0,DOWN); } int main() { plinit(PS,"pltrace3",A4,0,0,"",""); plclip(0,20,185,277); // plot several frames (r*r cm) and a curve in it curve(snail ,20,10 ,"snail-line", "(x2^+y2^-ax)2^=b2^(x2^+y2^)"); curve(cassin,20,19 ,"cassini's ovals", "(x2^+y2^+a2^)2^=4a2^x2^+b4^"); curve(cassin,20,20 ,"bernoulli's lemniscate","(x2^+y2^)2^=a2^(x2^-y2^)"); curve(folium,10, 0 ,"descartes' folium", "x3^+y3^=3axy"); curve(astrid,30, 0 ,"astroid", "x2/3^+y2/3^=a2/3^"); curve(concho,10,20 ,"nicomedes' conchoid", "(y-a)2^(x2^+y2^)=b2^y2^"); exit(0); }