30 static void arcset(
int,
int,
GRAPH*,
int,
int,
char*,
char*);
31 static void cliparc(
int,
int,
int,
double,
double,
int,
int,
int);
56 double xdelta, ydelta;
68 if ((graph->datawindow.xmin > graph->datawindow.xmax)
69 || (graph->datawindow.ymin > graph->datawindow.ymax)) {
71 "gr_fixgrid: Internal Error - bad limits: %lg, %lg, %lg, %lg\r\n",
72 graph->datawindow.xmin, graph->datawindow.xmax,
73 graph->datawindow.ymin, graph->datawindow.xmax);
78 graph->grid.circular =
true;
83 graph->grid.circular =
true;
87 graph->grid.circular =
false;
91 dd =
loggrid(graph, graph->datawindow.xmin,
92 graph->datawindow.xmax,
95 dd =
lingrid(graph, graph->datawindow.xmin,
96 graph->datawindow.xmax,
98 graph->datawindow.xmin = dd[0];
99 graph->datawindow.xmax = dd[1];
102 dd =
loggrid(graph, graph->datawindow.ymin,
103 graph->datawindow.ymax,
106 dd =
lingrid(graph, graph->datawindow.ymin,
107 graph->datawindow.ymax,
109 graph->datawindow.ymin = dd[0];
110 graph->datawindow.ymax = dd[1];
124 if (graph->grid.xlabel) {
126 graph->absolute.width -
127 (strlen(graph->grid.xlabel) + 3) * graph->fontwidth,
130 if (graph->grid.ylabel) {
135 graph->absolute.height * 3 / 4 );
140 graph->absolute.height / 2 );
144 switch ( graph->grid.gridtype ) {
157 graph->grid.xaxis.log.lmt,
158 graph->grid.xaxis.log.decsp,
159 graph->grid.xaxis.log.subs,
160 graph->grid.xaxis.log.pp,
x_axis);
165 graph->grid.xaxis.lin.units,
166 graph->grid.xaxis.lin.spacing,
167 graph->grid.xaxis.lin.numspace,
168 graph->grid.xaxis.lin.distance,
169 graph->grid.xaxis.lin.lowlimit,
170 graph->grid.xaxis.lin.highlimit,
171 graph->grid.xaxis.lin.onedec,
172 graph->grid.xaxis.lin.mult,
177 switch ( graph->grid.gridtype ) {
185 graph->grid.yaxis.log.lmt,
186 graph->grid.yaxis.log.decsp,
187 graph->grid.yaxis.log.subs,
188 graph->grid.yaxis.log.pp,
y_axis);
193 graph->grid.yaxis.lin.units,
194 graph->grid.yaxis.lin.spacing,
195 graph->grid.yaxis.lin.numspace,
196 graph->grid.yaxis.lin.distance,
197 graph->grid.yaxis.lin.lowlimit,
198 graph->grid.yaxis.lin.highlimit,
199 graph->grid.yaxis.lin.onedec,
200 graph->grid.yaxis.lin.mult,
218 int mag, hmt, lmt, nsp, spacing, dst;
228 margin = graph->viewportxoff;
229 max = graph->viewport.width + graph->viewportxoff;
232 margin = graph->viewportyoff;
233 max = graph->viewport.height + graph->viewportyoff;
237 fprintf(
cp_err,
"Warning: %cdelta is negative -- ignored\n",
238 (axis ==
x_axis) ?
'x' :
'y');
247 tenpowmag = pow(10.0, (
double) mag);
250 if ((mag % 3) && !((mag - 1) % 3)) {
254 else if ((mag % 3) && !((mag + 1) % 3)) {
261 lmt = (int) floor(lo / tenpowmag);
262 hmt = (int) ceil(hi / tenpowmag);
263 if (fabs((hi - tenpowmag)/tenpowmag) < 1
e-20) {
277 dd[0] = lo = lmt * tenpowmag;
278 dd[1] = hi = hmt * tenpowmag;
285 for (nsp = 5; nsp < 10; nsp++)
289 for (nsp = 2; nsp < 5; nsp++)
293 if ((dst == 11) || (dst == 13) || (dst == 17) || (dst == 19))
295 spacing = (max - margin) / nsp;
302 nsp = (hi - lo) / delta;
303 spacing = (max - margin) * delta / (hi - lo);
315 if (nsp && (delta == 0.0)) {
317 graph->viewport.width = spacing * nsp;
319 graph->viewport.height = spacing * nsp;
368 (void) sprintf(buf,
"e%d", mag);
372 (
void) strcat(buf, s);
375 (void) sprintf(buf,
"e%d", mag);
378 (
void) sprintf(buf,
"e%d", mag);
383 graph->grid.xaxis.lin.spacing = spacing;
384 graph->grid.xaxis.lin.numspace = nsp;
385 graph->grid.xaxis.lin.distance = dst;
386 graph->grid.xaxis.lin.lowlimit = lmt;
387 graph->grid.xaxis.lin.highlimit = hmt;
388 graph->grid.xaxis.lin.onedec = onedec;
389 graph->grid.xaxis.lin.mult = mult;
390 (void)
strcpy(graph->grid.xaxis.lin.units, buf);
393 graph->grid.yaxis.lin.spacing = spacing;
394 graph->grid.yaxis.lin.numspace = nsp;
395 graph->grid.yaxis.lin.distance = dst;
396 graph->grid.yaxis.lin.lowlimit = lmt;
397 graph->grid.yaxis.lin.highlimit = hmt;
398 graph->grid.yaxis.lin.onedec = onedec;
399 graph->grid.yaxis.lin.mult = mult;
400 (void)
strcpy(graph->grid.yaxis.lin.units, buf);
413 int hmt, lmt, nsp, spacing, dst, mult;
423 for (i = 0, j = lmt; j <= hmt; i += spacing, j += dst / nsp) {
429 DevLine(graph->viewportxoff + i,
430 graph->viewportyoff, graph->viewportxoff + i,
431 graph->viewport.height + graph->viewportyoff);
434 graph->viewportyoff + i,
435 graph->viewport.width + graph->viewportxoff,
436 graph->viewportyoff + i);
441 (void) sprintf(buf,
"%.1lf", (
double) j / 10);
443 (
void) sprintf(buf,
"%d", j * mult);
445 DevText(buf, graph->viewportxoff + i -
446 strlen(buf) / 2 * graph->fontwidth,
447 (
int) (graph->fontheight * 2.5));
449 DevText(buf, graph->viewportxoff -
450 graph->fontwidth * (strlen(buf) + 1),
451 graph->viewportyoff + i -
452 graph->fontheight / 2);
459 graph->absolute.width -
460 (strlen(units) + 15) * graph->fontwidth,
463 DevText(units, graph->fontwidth,
464 (
int) (graph->absolute.height * 0.75));
482 int decs,
subs,
pp, decsp, lmt, hmt;
485 margin = graph->viewportxoff;
486 max = graph->viewport.width + graph->viewportxoff;
489 margin = graph->viewportyoff;
490 max = graph->viewport.height + graph->viewportyoff;
501 dd[0] = pow(10.0, (
double) lmt);
502 dd[1] = pow(10.0, (
double) hmt);
511 decsp = (max - margin) * pp / decs;
514 graph->grid.xaxis.log.hmt = hmt;
515 graph->grid.xaxis.log.lmt = lmt;
516 graph->grid.xaxis.log.decsp = decsp;
517 graph->grid.xaxis.log.subs =
subs;
518 graph->grid.xaxis.log.pp = pp;
521 graph->grid.yaxis.log.hmt = hmt;
522 graph->grid.yaxis.log.lmt = lmt;
523 graph->grid.yaxis.log.decsp = decsp;
524 graph->grid.yaxis.log.subs =
subs;
525 graph->grid.yaxis.log.pp = pp;
535 int hmt, lmt, decsp,
subs,
pp;
543 for (i = 0, j = lmt; j <= hmt; i += decsp, j += pp) {
547 DevLine(graph->viewportxoff + i,
549 graph->viewportxoff + i,
550 graph->viewport.height
551 +graph->viewportyoff);
554 graph->viewportyoff + i,
555 graph->viewport.width
556 + graph->viewportxoff,
557 graph->viewportyoff + i);
559 (void) sprintf(buf,
"e%d", j);
561 DevText(buf, graph->viewportxoff + i - strlen(buf) / 2,
562 (
int) (graph->fontheight * 2.5));
564 DevText(buf, graph->viewportxoff - graph->fontwidth *
566 graph->viewportyoff + i -
567 graph->fontheight / 2);
573 for (k = 1; k <=
subs; k++) {
574 l = ceil((
double) k * 10 / subs);
577 m = decsp * log10((
double ) l) + i;
580 DevLine(graph->viewportxoff + m,
582 graph->viewportxoff + m,
583 graph->viewport.height
584 + graph->viewportyoff);
587 graph->viewportyoff + m,
588 graph->viewport.width
589 + graph->viewportxoff,
590 graph->viewportyoff + m);
600 #define minrad (graph->grid.xaxis.circular.mrad) 601 #define maxrad (graph->grid.yaxis.circular.mrad) 609 double rad, tenpowmag, theta;
610 int hmt, lmt, mag, step;
613 bool centered =
true;
616 if (graph->viewport.width > graph->viewport.height) {
620 graph->viewport.height = graph->viewport.width;
623 if (graph->viewport.width & 1) {
624 graph->viewport.width += 1;
625 graph->viewport.height += 1;
628 graph->grid.xaxis.circular.center = (graph->viewport.width/2.0
629 + graph->viewportxoff);
630 graph->grid.yaxis.circular.center = (graph->viewport.height/2.0
631 + graph->viewportyoff);
632 graph->grid.xaxis.circular.radius = graph->viewport.width / 2;
635 rad = sqrt(graph->datawindow.xmin * graph->datawindow.xmin
636 + graph->datawindow.ymin * graph->datawindow.ymin);
640 rad = sqrt(graph->datawindow.xmin * graph->datawindow.xmin
641 + graph->datawindow.ymax * graph->datawindow.ymax);
646 rad = sqrt(graph->datawindow.xmax * graph->datawindow.xmax
647 + graph->datawindow.ymin * graph->datawindow.ymin);
652 rad = sqrt(graph->datawindow.xmax * graph->datawindow.xmax
653 + graph->datawindow.ymax * graph->datawindow.ymax);
660 fprintf(
cp_err,
"Error: 0 radius in polargrid\n");
663 if ((graph->datawindow.xmin < 0) && (graph->datawindow.ymin < 0) &&
664 (graph->datawindow.xmax > 0) && (graph->datawindow.ymax > 0))
666 if ((graph->datawindow.xmin == - graph->datawindow.xmax)
667 && (graph->datawindow.ymin == -graph->datawindow.ymax)
668 && (graph->datawindow.xmin == graph->datawindow.ymin))
672 tenpowmag = pow(10.0, (
double) mag);
675 if (hmt * tenpowmag <
maxrad)
677 if (lmt * tenpowmag >
minrad)
682 xx = graph->datawindow.xmin + graph->datawindow.xmax;
683 yy = graph->datawindow.ymin + graph->datawindow.ymax;
684 graph->datawindow.xmin = xx -
maxrad;
685 graph->datawindow.xmax = xx +
maxrad;
686 graph->datawindow.ymin = yy -
maxrad;
687 graph->datawindow.ymax = yy +
maxrad;
691 printf(
"polar: maxrad = %g, center = (%g, %g)\n",
694 if ((
minrad == 0) && ((hmt - lmt) > 5)) {
695 if (!((hmt - lmt) % 2))
697 else if (!((hmt - lmt) % 3))
705 graph->grid.xaxis.circular.lmt = lmt;
706 graph->grid.yaxis.circular.lmt = step;
715 double mx, my, rad, tenpowmag, theta;
717 int relcx, relcy, relrad, dist, degs;
719 double pixperunit, xx, yy;
725 step = graph->grid.yaxis.circular.lmt;
727 tenpowmag = pow(10.0, (
double) mag);
728 pixperunit = graph->grid.xaxis.circular.radius / (
maxrad -
minrad);
730 relcx = - (graph->datawindow.xmin + graph->datawindow.xmax) / 2
732 relcy = - (graph->datawindow.ymin + graph->datawindow.ymax) / 2
734 dist = sqrt((
double) (relcx * relcx + relcy * relcy));
737 DevArc(graph->grid.xaxis.circular.center,
738 graph->grid.yaxis.circular.center,
739 graph->grid.xaxis.circular.radius,
744 for (i = graph->grid.xaxis.circular.lmt; (relrad = i * tenpowmag * pixperunit) <=
745 dist + graph->grid.xaxis.circular.radius; i += step) {
746 cliparc(graph->grid.xaxis.circular.center + relcx,
747 graph->grid.yaxis.circular.center + relcy,
749 graph->grid.xaxis.circular.center,
750 graph->grid.yaxis.circular.center,
751 graph->grid.xaxis.circular.radius);
754 theta = atan2((
double) relcy, (
double) relcx);
757 if (i && (relrad > dist - graph->grid.xaxis.circular.radius))
759 (
int) (graph->grid.xaxis.circular.center -
760 (relrad - dist) *
cos(theta)),
761 (
int) (graph->grid.yaxis.circular.center
762 - (relrad - dist) *
sin(theta)));
769 if ((graph->datawindow.xmin <= 0.0)
770 && (graph->datawindow.xmax >= 0.0)
771 && (graph->datawindow.ymin <= 0.0)
772 && (graph->datawindow.ymax >= 0.0)) {
773 for (i = 0; i < 12; i++) {
774 x1 = graph->grid.xaxis.circular.center + relcx;
775 y1 = graph->grid.yaxis.circular.center + relcy;
776 x2 = x1 + graph->grid.xaxis.circular.radius * 2
778 y2 = y1 + graph->grid.xaxis.circular.radius * 2
781 graph->grid.xaxis.circular.center,
782 graph->grid.yaxis.circular.center,
783 graph->grid.xaxis.circular.radius)) {
792 theta = 2 * asin((
double) graph->grid.xaxis.circular.radius
794 theta = theta * 180 /
M_PI;
801 else if (theta / 15 > 3)
803 else if (theta / 5 > 3)
809 for (i = 0; i < 360; i+= degs) {
810 x1 = graph->grid.xaxis.circular.center + relcx;
811 y1 = graph->grid.yaxis.circular.center + relcy;
812 x2 = x1 + dist * 2 *
cos(i *
M_PI / 180);
813 y2 = y1 + dist * 2 *
sin(i *
M_PI / 180);
815 graph->grid.xaxis.circular.center,
816 graph->grid.yaxis.circular.center,
817 graph->grid.xaxis.circular.radius)) {
825 (void) sprintf(buf,
"e%d", mag);
826 DevText(buf, graph->grid.xaxis.circular.center
827 + graph->grid.xaxis.circular.radius,
828 graph->grid.yaxis.circular.center
829 - graph->grid.xaxis.circular.radius);
849 int deg, x, y, lx, ly;
855 if (sqrt((
double) (x - lx) * (x - lx) + (y - ly) * (y - ly)) <
MINDIST)
857 (void) sprintf(buf,
"%d", deg);
858 w = graph->fontwidth * (strlen(buf) + 1);
859 h = graph->fontheight * 1.5;
860 angle = atan2((
double) (y - ly), (
double) (x - lx));
861 d = fabs(
cos(angle)) * w / 2 + fabs(
sin(angle)) * h / 2 +
LOFF;
863 x = x + d *
cos(angle) - w / 2;
864 y = y + d *
sin(angle) - h / 2;
867 DevText(
"o", x + strlen(buf) * graph->fontwidth,
868 y + graph->fontheight / 2);
889 (void) sprintf(buf,
"%d", lab);
891 y = y - graph->fontheight - 2;
892 x = x - graph->fontwidth * strlen(buf) - 3;
910 if (graph->viewport.width > graph->viewport.height) {
911 graph->viewport.width = graph->viewport.height;
914 graph->viewport.height = graph->viewport.width;
917 graph->grid.xaxis.circular.center = (graph->viewport.width/2.0
918 + graph->viewportxoff);
919 graph->grid.yaxis.circular.center = (graph->viewport.height/2.0
920 + graph->viewportyoff);
921 graph->grid.xaxis.circular.radius = graph->viewport.width / 2;
927 if (fabs(graph->datawindow.ymin) > fabs(graph->datawindow.ymax))
928 graph->datawindow.ymax = - graph->datawindow.ymin;
930 graph->datawindow.ymin = - graph->datawindow.ymax;
934 mx = graph->datawindow.xmax - graph->datawindow.xmin;
935 my = graph->datawindow.ymax - graph->datawindow.ymin;
937 graph->datawindow.ymin -= (mx - my) / 2;
938 graph->datawindow.ymax += (mx - my) / 2;
941 graph->datawindow.xmin -= (my - mx) / 2;
942 graph->datawindow.xmax += (my - mx) / 2;
946 mx = (graph->datawindow.xmin + graph->datawindow.xmax) / 2;
947 my = (graph->datawindow.ymin + graph->datawindow.ymax) / 2;
948 d = sqrt(mx * mx + my * my);
949 maxrad = d + (graph->datawindow.xmax - graph->datawindow.xmin) / 2;
950 minrad = d - (graph->datawindow.xmax - graph->datawindow.xmin) / 2;
959 double rad, tenpowmag,
d, x;
962 int mt, mag, i, j, k, zheight;
964 char buf[64], plab[32], nlab[32];
965 bool centered =
false;
971 if ((graph->datawindow.xmin == - graph->datawindow.xmax) &&
972 (graph->datawindow.ymin == -
973 graph->datawindow.ymax) && (graph->datawindow.xmin ==
974 graph->datawindow.ymin))
978 tenpowmag = pow(10.0, (
double) mag);
980 pixperunit = 2 * graph->grid.xaxis.circular.radius / (
maxrad -
minrad);
982 relcx = - (graph->datawindow.xmin + graph->datawindow.xmax) / 2
984 relcy = - (graph->datawindow.ymin + graph->datawindow.ymax) / 2
990 for (mag = -20; mag < 20; mag++) {
992 i = graph->grid.xaxis.circular.radius
993 * pow(10.0, (
double) mag) /
maxrad;
1022 i = j * pow(10.0, (
double) mag) * pixperunit / 2;
1023 if (i / 5 > graph->grid.xaxis.circular.radius + pixperunit
1024 + ((relcx > 0) ? relcx : - relcx))
1026 x = j * pow(10.0, (
double) (mag));
1032 (void) sprintf(plab,
"%lg", (2-x)/x);
1033 (void) sprintf(nlab,
"-%lg",(1+x)/x);
1036 (
int)(relcx + pixperunit), relcy,plab,nlab);
1037 if (i * 2.5 < graph->grid.xaxis.circular.radius
1038 + ((relcx > 0) ? relcx : - relcx))
1050 fprintf(
cp_err,
"smithgrid: Internal Error: screwed up\n");
1054 DevArc( graph->grid.xaxis.circular.center,
1055 graph->grid.yaxis.circular.center,
1056 graph->grid.xaxis.circular.radius, 0.0, 0.0);
1057 if ((relcx + pixperunit > - graph->grid.xaxis.circular.radius )
1058 && (relcx + pixperunit < graph->grid.xaxis.circular.radius )) {
1059 zheight = graph->grid.xaxis.circular.radius
1060 *
sin(acos((
double) (relcx + pixperunit)
1061 / graph->grid.xaxis.circular.radius ));
1063 zheight = - zheight;
1064 x1 = graph->grid.xaxis.circular.center + relcx + pixperunit;
1065 y1 = graph->grid.yaxis.circular.center - zheight;
1066 x2 = graph->grid.xaxis.circular.center + relcx + pixperunit;
1067 y2 = graph->grid.yaxis.circular.center + zheight;
1070 graph->grid.xaxis.circular.center,
1071 graph->grid.yaxis.circular.center,
1072 graph->grid.xaxis.circular.radius))
1076 if ((relcy > - graph->grid.xaxis.circular.radius )
1077 && (relcy < graph->grid.xaxis.circular.radius )) {
1078 zheight = graph->grid.xaxis.circular.radius
1079 *
cos(asin((
double) relcy / graph->grid.xaxis.circular.radius ));
1081 zheight = - zheight;
1082 DevLine( graph->grid.xaxis.circular.center - zheight,
1083 graph->grid.yaxis.circular.center + relcy,
1084 graph->grid.xaxis.circular.center + zheight,
1085 graph->grid.yaxis.circular.center + relcy);
1097 gi_text(
"0", gr_xcenter + gr_radius +
gi_fntwidth, gr_ycenter -
1099 gi_text(
"o", gr_xcenter + gr_radius +
gi_fntwidth * 2, gr_ycenter, 0,
1101 gi_text(
"90", gr_xcenter -
gi_fntwidth, gr_ycenter + gr_radius +
1103 gi_text(
"o", gr_xcenter +
gi_fntwidth, gr_ycenter + gr_radius +
1105 gi_text(
"180", gr_xcenter - gr_radius -
gi_fntwidth * 5, gr_ycenter
1107 gi_text(
"o", gr_xcenter - gr_radius -
gi_fntwidth * 2, gr_ycenter, 0,
1109 gi_text(
"-90", gr_xcenter -
gi_fntwidth * 2, gr_ycenter - gr_radius -
1111 gi_text(
"o", gr_xcenter +
gi_fntwidth, gr_ycenter - gr_radius -
1132 int rad, prevrad, xoffset, yoffset;
1136 double angle = atan(((
double) prevrad) / rad);
1144 graph->
grid.
yaxis.circular.center + yoffset, rad,
1145 2 * angle, 2 *
M_PI - 2 * angle,
1151 graph->
grid.
yaxis.circular.center + yoffset, rad,
1152 M_PI + 2 * angle,
M_PI - 2 * angle,
1163 graph->
grid.
yaxis.circular.center + yoffset + rad, rad,
1164 M_PI * 1.5 + 2 * angle,
M_PI * 1.5 - 2 * angle,
1170 graph->
grid.
yaxis.circular.center + yoffset - rad, rad,
1171 M_PI / 2 + 2 * angle,
M_PI / 2 - 2 * angle,
1181 x = graph->
grid.
xaxis.circular.center + xoffset
1182 - 2 * rad - graph->
fontwidth * strlen(plab) - 2;
1183 if ((x > graph->
viewportxoff ) && (x < graph->viewportxoff +
1188 x = graph->
grid.
xaxis.circular.center + xoffset
1189 + 2 * rad - graph->
fontwidth * strlen(nlab) - 2;
1192 && ( 2 * rad + xoffset < graph->grid.xaxis.circular.radius))
1208 int cx, cy, rad, clipx, clipy, cliprad;
1211 int x, y, tx, ty, dist;
1212 double alpha, theta,
phi, a1, a2,
d,
l;
1217 dist = sqrt((
double) (x * x + y * y));
1219 if (!rad || !cliprad)
1221 if (dist + rad < cliprad) {
1223 DevArc(cx, cy, rad, start, end);
1226 else if ((dist - rad >= cliprad) || (rad - dist >= cliprad)) {
1234 phi = atan((
double) y / x);
1244 alpha = (double) (dist * dist + rad * rad - cliprad * cliprad) /
1248 else if (alpha > 1.0)
1250 alpha = acos(alpha);
1258 while (a1 >=
M_PI * 2)
1260 while (a2 >=
M_PI * 2)
1263 tx =
cos(start) * rad + x;
1264 ty =
sin(start) * rad + y;
1265 d = sqrt((
double) tx * tx + ty * ty);
1266 in = (d > cliprad) ?
false :
true;
1272 if ((end < d) && (end >
start))
1274 if ((a1 < d) && (a1 >
start))
1276 if ((a2 < d) && (a2 >
start))
1278 if (d ==
M_PI * 3) {
1287 DevArc(cx, cy, rad, start, d);
1291 in = in ?
false :
true;
1296 if ((end < d) && (end > l))
1298 if ((a1 < d) && (a1 > l))
1300 if ((a2 < d) && (a2 > l))
1302 if (d ==
M_PI * 3) {
1311 DevArc(cx, cy, rad, l, d);
1314 in = in ?
false :
true;
1318 DevArc(cx, cy, rad, d, end);
1351 return (- floor(-
d));
static struct subs * subs
static char buf[MAXPROMPT]
static void drawsmithgrid()
static double * lingrid()
void gr_redrawgrid(GRAPH *graph)
static void adddeglabel()
union graph::@4::@7 yaxis
static void drawlingrid()
static void drawloggrid()
union graph::@4::@7 xaxis
static double * loggrid()
static void drawpolargrid()
static void addradlabel()
void gr_fixgrid(GRAPH *graph, double xdelta, double ydelta, int xtype, int ytype)
struct graph::@1 viewport