home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / printer / graphpaper / src / src.lha / draw.c < prev    next >
C/C++ Source or Header  |  1993-04-06  |  5KB  |  206 lines

  1. #include "graph.h"
  2.  
  3. int maxx, maxy;
  4. int xoffset=0, yoffset=0;
  5. int maxthick;
  6.  
  7. static void testbox(void)
  8. {
  9.     /* diagonals */
  10.     Move(rast, 0   , 0   );
  11.     Draw(rast, maxx, maxy);
  12.     Move(rast, 0   , maxy);
  13.     Draw(rast, maxx, 0   );
  14.  
  15.     /* sides */
  16.     Move(rast, 0, 0   );
  17.     Draw(rast, 0, maxy);
  18.     Move(rast, maxx, 0   );
  19.     Draw(rast, maxx, maxy);
  20.  
  21.     /* top, bottom */
  22.     Move(rast, 0   , 0);
  23.     Draw(rast, maxx, 0);
  24.     Move(rast, 0   , maxy);
  25.     Draw(rast, maxx, maxy);
  26. }
  27.  
  28. int biggestx  = -10000;
  29. int biggesty  = -10000;
  30. int smallestx = +10000;
  31. int smallesty = +10000;
  32.  
  33. void range(int x, int y)
  34. {
  35.     int problem = 0; 
  36.  
  37.     if (x < 0) {
  38.         printf("Internal error: X too small: %d\n", x);
  39.         problem = 1;
  40.     }
  41.     if (y < 0) {
  42.         printf("Internal error: Y too small: %d\n", y);
  43.         problem = 1;
  44.     }
  45.     if (x >= WIDTH) {
  46.         printf("Internal error: X too big:   %d\n", x);
  47.         problem = 1;
  48.     }
  49.     if (y >= HEIGHT) {
  50.         printf("Internal error: Y too big:   %d\n", y);
  51.         problem = 1;
  52.     }
  53.     if (problem) {
  54.         exit(1);
  55.     }
  56. }
  57.  
  58. void showmax(void)
  59. {
  60.     printf("X range used: %4d  to %4d\n", smallestx, biggestx);
  61.     printf("Y range used: %4d  to %4d\n", smallesty, biggesty);
  62. }
  63.  
  64.  
  65. #define RECORD(x,y) { \
  66.     if (x>biggestx) biggestx=x;   \
  67.     if (y>biggesty) biggesty=y;   \
  68.     if (x<smallestx) smallestx=x; \
  69.     if (y<smallesty) smallesty=y; \
  70.     range(x,y);                   \
  71.     }
  72.  
  73. #if 1
  74. #define MOVE(r,x,y)   {RECORD(x,y); Move(r,x,y);}
  75. #define DRAW(r,x,y)   {RECORD(x,y); Draw(r,x,y);}
  76. #else
  77. #define MOVE(r,x,y)   Move(r,x,y)
  78. #define DRAW(r,x,y)   Draw(r,x,y)
  79. #endif
  80.  
  81. static void drawHline(int x1, int x2, int y, int thickness)
  82. {
  83.     int halfwidth = thickness>>1;
  84.     int i;
  85.  
  86.     /* horizontal */
  87.     y = y - halfwidth;
  88.     for (i=y; i<=y+thickness-1; ++i) {
  89.         MOVE(rast, xoffset+x1,yoffset+i);
  90.         DRAW(rast, xoffset+x2,yoffset+i);
  91.     }
  92. }
  93.  
  94. static void drawVline(int x, int y1, int y2, int thickness)
  95. {
  96.     int halfwidth = thickness>>1;
  97.     int i;
  98.  
  99.     /* vertical */
  100.     x = x - halfwidth;
  101.     for (i=x; i<=x+thickness-1; ++i) {
  102.         MOVE(rast, xoffset+i,yoffset+y1);
  103.         DRAW(rast, xoffset+i,yoffset+y2);
  104.     }
  105. }
  106.  
  107. static void DrawFixedHoriz(float spacing, int thickness)
  108. {
  109.     float i;
  110.     int halfmax = maxthick>>1;
  111.  
  112.     for (i=halfmax; i<=maxy-halfmax+1; i += spacing) {
  113.         drawHline(0, maxx,(int)i, thickness);
  114.     }
  115. }
  116.  
  117. static void DrawLogHoriz(float spacing, int thickness, int numcycles)
  118. {
  119.     float i;
  120.     float cycle;
  121.     int halfmax = maxthick>>1;
  122.  
  123.     for (cycle=halfmax; cycle<=maxy-halfmax-0.5*spacing; cycle += spacing) {
  124.         for (i=2; i < numcycles; i += 1) {
  125.             drawHline(0, maxx, (int)(cycle+(1.-log(i)/log(numcycles))*spacing), thickness);
  126.                                   /* ^^^^^^^^^^^^^ top to bottom */
  127.         }
  128.     }
  129. }
  130.  
  131. static void DrawFixedVert(float spacing, int thickness)
  132. {
  133.     float i;
  134.     int halfmax = maxthick>>1;
  135.  
  136.     /* vertical lines */
  137.     for (i=halfmax; i<=maxx-halfmax+1; i += spacing) {
  138.         drawVline((int)i,0, maxy, thickness);
  139.     }
  140. }
  141.  
  142. static void DrawLogVert(float spacing, int thickness, int numcycles)
  143. {
  144.     float i;
  145.     float cycle;
  146.     int halfmax = maxthick>>1;
  147.  
  148.     /* vertical lines */
  149.     for (cycle=halfmax; cycle<=maxx-halfmax-0.5*spacing; cycle += spacing) {
  150.         for (i=2; i < numcycles; i += 1) {
  151.             drawVline((int)(cycle+log(i)/log(numcycles)*spacing),0, maxy, thickness);
  152.         }
  153.     }
  154. }
  155.  
  156.  
  157. void DrawGraph(void)
  158. {
  159.     float x_Major_Pixel_Spacing, y_Major_Pixel_Spacing;
  160.     float x_Minor_Pixel_Spacing, y_Minor_Pixel_Spacing;
  161.  
  162.     maxx = WIDTH -FUDGE -1;   /* range: 0..maxx-1 */
  163.     maxy = HEIGHT-FUDGE -1;
  164.  
  165.     /* testbox(); */
  166.  
  167.     x_Major_Pixel_Spacing = x_dpi_V * x_size_v;
  168.     x_Minor_Pixel_Spacing = x_Major_Pixel_Spacing / minor_x_v;
  169.  
  170.     y_Major_Pixel_Spacing = y_dpi_V * y_size_v;
  171.     y_Minor_Pixel_Spacing = y_Major_Pixel_Spacing / minor_y_v;
  172.  
  173.     xoffset = 0;  /* obsolete */
  174.     yoffset = 0;
  175.  
  176.     /* all get major axis */
  177.     DrawFixedVert (x_Major_Pixel_Spacing, Major_Thickness_V);
  178.     DrawFixedHoriz(y_Major_Pixel_Spacing, Major_Thickness_V);
  179.  
  180.     /* minor axis depends on mode */
  181.     /* switch statements don't work with pointers */
  182.          if (MinorMode == &None)   {
  183.             /* nothing to do */
  184.             }
  185.     else if (MinorMode == &Linear) { 
  186.             DrawFixedVert (x_Minor_Pixel_Spacing, Minor_Thickness_V);
  187.             DrawFixedHoriz(y_Minor_Pixel_Spacing, Minor_Thickness_V);
  188.             }
  189.     else if (MinorMode == &LogLog) {
  190.             DrawLogVert   (x_Major_Pixel_Spacing, Minor_Thickness_V, minor_x_v);
  191.             DrawLogHoriz  (y_Major_Pixel_Spacing, Minor_Thickness_V, minor_y_v);
  192.             }
  193.     else if (MinorMode == &LogY)   {
  194.             DrawFixedVert (x_Minor_Pixel_Spacing, Minor_Thickness_V);
  195.             DrawLogHoriz  (y_Major_Pixel_Spacing, Minor_Thickness_V, minor_y_v);
  196.             }
  197.     else if (MinorMode == &LogX)   {
  198.             DrawFixedHoriz(x_Minor_Pixel_Spacing, Minor_Thickness_V);
  199.             DrawLogVert   (y_Major_Pixel_Spacing, Minor_Thickness_V, minor_x_v);
  200.             }
  201.     else {  printf("Error in DrawGraph\n");
  202.             exit(1);
  203.          }
  204.  /* showmax(); */
  205. }
  206.