/tags/rxvt-2-4-7/src/graphics/qplot.c

# · C · 257 lines · 222 code · 29 blank · 6 comment · 47 complexity · 06d0341fd89d99b592af1febff260529 MD5 · raw file

  1. static const char rcsid[] = "$Id: qplot.c 8 1998-04-20 07:31:14Z mason $";
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <signal.h>
  6. #include "grxlib.h"
  7. #define Real float
  8. #ifndef GRX_SCALE
  9. # define GRX_SCALE 10000
  10. #endif
  11. #define DEFAULT_DATA_FILE "data"
  12. static void
  13. axis_round (Real *min, Real *max, Real *grid_spacing)
  14. {
  15. int logspace;
  16. logspace = (int)(log10 ((*max - *min)/10.0) + 0.5);
  17. *grid_spacing = pow (10, (double)logspace);
  18. *min = (Real)((int)(*min / (*grid_spacing))) * (*grid_spacing);
  19. *max = (Real)((int)(*max / (*grid_spacing))+1) * (*grid_spacing);
  20. }
  21. static int
  22. nice_end (int junk)
  23. {
  24. CloseGraphics ();
  25. putchar ('\n');
  26. exit (EXIT_SUCCESS);
  27. return 0;
  28. }
  29. int
  30. main (int argc, char **argv)
  31. {
  32. char line[256], *file = NULL;
  33. long id,winclick;
  34. int Do_Start = 1,tmp;
  35. Real x[1000000], y[1000000];
  36. Real nls[1000];
  37. int m, p, i, j, n, nchars, theight, twidth, xclick, yclick;
  38. int downx = 1000,downy = 1000,upx,upy;
  39. Real xmax, xmin, ymax, ymin, xdiff, ydiff, xgrid_spacing, ygrid_spacing;
  40. FILE *fd;
  41. char axis[100];
  42. LineFunction linetype = StartLine;
  43. ymax = xmax = -HUGE_VAL;
  44. ymin = xmin = HUGE_VAL;
  45. for (i = 1; i < argc; i++)
  46. {
  47. if (*argv[i] == '-')
  48. {
  49. if (!strcmp (argv[i], "-nl"))
  50. linetype = StartPoint;
  51. else if (argv[i][1] == '\0') /* use stdin */
  52. file = argv [i];
  53. else
  54. {
  55. fprintf(stderr,
  56. "Usage:\n\t %s [options] [file]\n\n", argv[0]);
  57. fprintf(stderr,
  58. "where options include:\n"
  59. " -pt plot with points instead of lines\n\n");
  60. fprintf(stderr,
  61. "file name `-' specifies stdin\n"
  62. "if no file name is specified, "
  63. "the default is \"%s\"\n\n",
  64. DEFAULT_DATA_FILE);
  65. return EXIT_FAILURE;
  66. }
  67. }
  68. else
  69. {
  70. file = argv [i];
  71. }
  72. }
  73. if (!strcmp (file, "-"))
  74. {
  75. fd = stdin;
  76. file = "stdin";
  77. }
  78. else
  79. {
  80. if (file == NULL) file = DEFAULT_DATA_FILE;
  81. if ((fd = fopen (file, "r")) == NULL)
  82. {
  83. fprintf (stderr, "%s: can't open file \"%s\"\n", argv[0], file);
  84. return EXIT_FAILURE;
  85. }
  86. }
  87. m = 0;
  88. p = 0;
  89. while (fgets(line, sizeof(line),fd) != NULL)
  90. {
  91. if (sscanf(line,"%f %f",&x[m], &y[m]) == 2)
  92. {
  93. if (x[m] > xmax) xmax = x[m]; else if (x[m] < xmin) xmin = x[m];
  94. if (y[m] > ymax) ymax = y[m]; else if (y[m] < ymin) ymin = y[m];
  95. m++;
  96. }
  97. else
  98. {
  99. nls [p] = m;
  100. p++;
  101. }
  102. }
  103. nls [p++] = m;
  104. if (m == 0)
  105. return;
  106. signal (SIGTERM, nice_end);
  107. signal (SIGSTOP, nice_end);
  108. signal (SIGTSTP, nice_end);
  109. signal (SIGINT, nice_end);
  110. signal (SIGQUIT, nice_end);
  111. if (!InitializeGraphics (1))
  112. return EXIT_FAILURE;
  113. n = 1;
  114. do
  115. {
  116. axis_round (&xmin, &xmax, &xgrid_spacing);
  117. axis_round (&ymin, &ymax, &ygrid_spacing);
  118. id = CreateWin (0, 0, GRX_SCALE, GRX_SCALE);
  119. if (id == 0)
  120. {
  121. fprintf (stderr,"Help id = 0\n");
  122. return EXIT_FAILURE;
  123. }
  124. /* Fill the window in black for real eye-catching graphics! */
  125. ForeColor (0);
  126. StartFill (id);
  127. FillArea (0, 0, GRX_SCALE, GRX_SCALE);
  128. Done ();
  129. /* draw outline box in white */
  130. ForeColor (7);
  131. /* Draw outline box */
  132. StartLine(id);
  133. Extend (1000, 1000);
  134. Extend (1000, 9000);
  135. Extend (9000, 9000);
  136. Extend (9000, 1000);
  137. Extend (1000, 1000);
  138. Done();
  139. /* Draw the data - either lines or dots */
  140. xdiff = 8000 / (xmax-xmin);
  141. ydiff = 8000 / (ymax-ymin);
  142. for (i = j = 0; j < p; j++)
  143. {
  144. int n = 0;
  145. ForeColor (j%6+1);
  146. while (((x[i] < xmin) || (x[i] > xmax) ||
  147. (y[i] < ymin) || (y[i] > ymax)) && (i < nls [j]))
  148. i++;
  149. while (i < nls [j])
  150. {
  151. if (n == 0)
  152. linetype (id);
  153. Extend (1000+(x[i]-xmin)*xdiff,9000-(y[i]-ymin)*ydiff);
  154. n++;
  155. if (n > 450)
  156. {
  157. Done ();
  158. n = 0;
  159. continue;
  160. }
  161. i++;
  162. while ((i < nls [j]) &&
  163. ((x [i] < xmin) || (x [i] > xmax) ||
  164. (y [i] < ymin) || (y [i] > ymax)))
  165. i++;
  166. }
  167. if (n > 0)
  168. Done ();
  169. }
  170. /* Do axis labels in black */
  171. ForeColor (7);
  172. QueryWin (id, &twidth,&theight);
  173. PlaceText (id, GRX_SCALE/2, 0, HCENTER_TEXT|TOP_TEXT, file);
  174. PlaceText (id, GRX_SCALE/2, GRX_SCALE, HCENTER_TEXT|BOTTOM_TEXT, "X");
  175. PlaceText (id, 0, GRX_SCALE/2, LEFT_TEXT|VCENTER_TEXT, "Y");
  176. sprintf (axis, "%f", ymax);
  177. nchars = 1000 / twidth;
  178. axis [nchars] = 0;
  179. PlaceText (id, GRX_SCALE/10, GRX_SCALE/10,
  180. RIGHT_TEXT|TOP_TEXT, axis);
  181. sprintf (axis, "%f", ymin);
  182. axis [nchars] = 0;
  183. PlaceText (id, GRX_SCALE/10, 9*GRX_SCALE/10,
  184. RIGHT_TEXT|BOTTOM_TEXT,axis);
  185. sprintf (axis, "%f",xmax);
  186. PlaceText (id, 9*GRX_SCALE/10, 9*GRX_SCALE/10,
  187. HCENTER_TEXT|TOP_TEXT,axis);
  188. sprintf (axis,"%f",xmin);
  189. PlaceText (id, GRX_SCALE/10, 9*GRX_SCALE/10,
  190. HCENTER_TEXT|TOP_TEXT,axis);
  191. fflush (stdout);
  192. do
  193. {
  194. n = WaitForCarriageReturn (&winclick, &xclick, &yclick);
  195. switch (n) {
  196. case 1:
  197. downx = xclick;
  198. downy = yclick;
  199. break;
  200. case 2:
  201. upx = xclick;
  202. upy = yclick;
  203. if (upx < downx)
  204. {
  205. tmp = downx;
  206. downx = upx;
  207. upx = tmp;
  208. }
  209. if (upy < downy)
  210. {
  211. tmp = downy;
  212. downy = upy;
  213. upy = tmp;
  214. }
  215. xmin = (xmax - xmin) * (downx - 1000) / (8000) + xmin;
  216. xmax = (xmax - xmin) * (upx - 1000) / (8000) + xmin;
  217. ymax = ymax - (ymax - ymin) * (downy - 1000) / (8000);
  218. ymin = ymax - (ymax - ymin) * (upy - 1000) / (8000);
  219. break;
  220. }
  221. }
  222. while (n && (n != 2));
  223. }
  224. while (n);
  225. nice_end (EXIT_SUCCESS);
  226. return EXIT_SUCCESS;
  227. }
  228. /*----------------------- end-of-file (C source) -----------------------*/