Path: utzoo!utgpu!watmath!clyde!att!rutgers!mailrus!ncar!ames!pasteur!miro.Berkeley.EDU!ph From: ph@miro.Berkeley.EDU (Paul Heckbert) Newsgroups: comp.graphics Subject: Re: I need a wheel... Message-ID: <7945@pasteur.Berkeley.EDU> Date: 2 Dec 88 22:34:51 GMT References: <3343@ucdavis.ucdavis.edu> Sender: news@pasteur.Berkeley.EDU Reply-To: ph@miro.Berkeley.EDU (Paul Heckbert) Organization: University of California at Berkeley Lines: 108 Keywords: In article <3343@ucdavis.ucdavis.edu> vmrad@deneb.ucdavis.edu asked for code to label axes with pleasing numbers and place tick marks at pleasing intervals. Here is some code I've used. The heart of it is a simple little routine called "nicenum" that picks "nice-looking" numbers. The below is geared toward y axis labeling but of course it could work equally well for the x axis. Paul Heckbert, CS grad student 508-7 Evans Hall, UC Berkeley UUCP: ucbvax!miro.berkeley.edu!ph Berkeley, CA 94720 ARPA: ph@miro.berkeley.edu /* * label: test program to demonstrate nice graph axis labeling * * Paul Heckbert, 2 Dec 88 */ #include #include double expt(), tick(), nicenum(); #define NTICK 5 /* desired number of tick marks */ main(ac, av) int ac; char **av; { double ymin, ymax; if (ac!=3) { fprintf(stderr, "Usage: label \n"); exit(1); } ymin = atof(av[1]); ymax = atof(av[2]); ylabel(ymin, ymax); } ylabel(ymin, ymax) double ymin, ymax; { char str[6], temp[20]; int exp; double graphymin, graphymax, range, d, y; /* we expect ymin!=ymax */ range = nicenum(ymax-ymin, 0); d = nicenum(range/(NTICK-1), 1); /* tick mark spacing */ graphymin = floor(ymin/d)*d; graphymax = ceil(ymax/d)*d; exp = floor(log10(d)); sprintf(str, "%%.%df", exp<0 ? -exp : 0); /* simplest axis labels */ printf("graphymin=%g graphymax=%g increment=%g\n", graphymin, graphymax, d); for (y=graphymin; y0) for (; n>0; n--) x *= a; else for (; n<0; n++) x /= a; return x; }