plot.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "grap.h"
  5. #include "y.tab.h"
  6. void line(int type, Point p1, Point p2, Attr *desc) /* draw a line segment */
  7. {
  8. fprintf(tfd, "%s %s from %s",
  9. type==LINE ? "line" : "arrow", desc_str(desc), xyname(p1));
  10. fprintf(tfd, " to %s", xyname(p2)); /* 'cause xyname is botched */
  11. fprintf(tfd, "\n");
  12. range(p1);
  13. range(p2);
  14. }
  15. void circle(double r, Point pt) /* draw a circle */
  16. {
  17. if (r > 0.0)
  18. fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt));
  19. else
  20. fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt));
  21. range(pt);
  22. }
  23. char *xyname(Point pt) /* generate xy name macro for point p */
  24. {
  25. static char buf[200];
  26. Obj *p;
  27. p = pt.obj;
  28. if (p->log & XFLAG) {
  29. if (pt.x <= 0.0)
  30. ERROR "can't take log of x coord %g", pt.x FATAL;
  31. logit(pt.x);
  32. }
  33. if (p->log & YFLAG) {
  34. if (pt.y <= 0.0)
  35. ERROR "can't take log of y coord %g", pt.y FATAL;
  36. logit(pt.y);
  37. }
  38. sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y);
  39. return buf; /* WATCH IT: static */
  40. }
  41. void pic(char *s) /* fire out pic stuff directly */
  42. {
  43. while (*s == ' ')
  44. s++;
  45. fprintf(tfd, "%s\n", s);
  46. }
  47. int auto_x = 0; /* counts abscissa if none provided */
  48. void numlist(void) /* print numbers in default way */
  49. {
  50. Obj *p;
  51. Point pt;
  52. int i;
  53. static char *spot = "\\(bu";
  54. Attr *ap;
  55. p = pt.obj = lookup(curr_coord, 1);
  56. if (nnum == 1) {
  57. nnum = 2;
  58. num[1] = num[0];
  59. num[0] = ++auto_x;
  60. }
  61. pt.x = num[0];
  62. if (p->attr && p->attr->sval)
  63. spot = p->attr->sval;
  64. for (i = 1; i < nnum; i++) {
  65. pt.y = num[i];
  66. if (p->attr == 0 || p->attr->type == 0) {
  67. ap = makesattr(tostring(spot));
  68. plot(ap, pt);
  69. } else
  70. next(p, pt, p->attr);
  71. }
  72. nnum = 0;
  73. }
  74. void plot(Attr *sl, Point pt) /* put stringlist sl at point pt */
  75. {
  76. fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt));
  77. range(pt);
  78. freeattr(sl);
  79. }
  80. void plotnum(double f, char *fmt, Point pt) /* plot value f at point */
  81. {
  82. char buf[100];
  83. if (fmt) {
  84. sprintf(buf, fmt, f);
  85. free(fmt);
  86. } else if (f >= 0.0)
  87. sprintf(buf, "%g", f);
  88. else
  89. sprintf(buf, "\\-%g", -f);
  90. fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt));
  91. range(pt);
  92. }
  93. void drawdesc(int type, Obj *p, Attr *desc, char *s) /* set line description for p */
  94. {
  95. p->attr = desc;
  96. p->attr->sval = s;
  97. if (type == NEW) {
  98. p->first = 0; /* so it really looks new */
  99. auto_x = 0;
  100. }
  101. }
  102. void next(Obj *p, Point pt, Attr *desc) /* add component to a path */
  103. {
  104. char *s;
  105. if (p->first == 0) {
  106. p->first++;
  107. fprintf(tfd, "L%s: %s\n", p->name, xyname(pt));
  108. } else {
  109. fprintf(tfd, "line %s from L%s to %s; L%s: Here\n",
  110. desc_str(desc->type ? desc : p->attr),
  111. p->name, xyname(pt), p->name);
  112. }
  113. if (p->attr && (s=p->attr->sval)) {
  114. /* BUG: should fix size here */
  115. fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt));
  116. }
  117. range(pt);
  118. }