home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / miscprog / mvsrc / graph.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  4KB  |  183 lines

  1. #include <graphics.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <dos.h>
  6. #include <bios.h>
  7. #include <mem.h>
  8. #include <string.h>
  9. #include <alloc.h>
  10. #include <time.h>
  11.  
  12. #include "graph.h"
  13.  
  14. makepic (char *picture [], unsigned codes [], int rows, int columns)
  15. {
  16.    int currentrow;
  17.    int currentcolumn;
  18.    unsigned mask;
  19.  
  20.    /* generate the picture */
  21.  
  22.    for (currentrow = 0; currentrow <= rows-1; currentrow++)
  23.       for (mask = 1, currentcolumn = 0; currentcolumn <= columns-1; mask <<= 1, currentcolumn++)
  24.          if (picture [currentrow] [currentcolumn] == PCHAR)
  25.             codes [currentrow] |= mask;  /* turn pixel on */
  26.                else
  27.                   codes [currentrow] &= (~mask); /* turn pixel off */
  28.  
  29. }
  30.  
  31. putpic (int x, int y, unsigned picture [], int rows, int columns)
  32. {
  33.    int currentrow;
  34.    int currentcolumn;
  35.    unsigned mask;
  36.  
  37.    for (currentrow = 0; currentrow <= rows-1; currentrow++)
  38.       for (mask = 1, currentcolumn = 1; currentcolumn <= columns; mask <<= 1, currentcolumn++)
  39.          if ((picture [currentrow]) & mask)
  40.             putpixel (x+currentcolumn, y+currentrow, DARKGRAY);
  41. }
  42.  
  43. putpicture (int x, int y, char *picture [], int rows, int columns)
  44. {
  45.    int currentrow;
  46.    int currentcolumn;
  47.  
  48.    for (currentrow = 0; currentrow <= rows-1; currentrow++)
  49.       for (currentcolumn = 0; currentcolumn <= columns-1; currentcolumn++)
  50.          if (picture [currentrow] [currentcolumn] == PCHAR)
  51.             putpixel (x+currentcolumn, y+currentrow, DARKGRAY);
  52. }
  53.  
  54.  
  55. graphinit ()
  56. {
  57.    int graphdriver;
  58.    int graphmode;
  59.    char *graphicspath;
  60.    int errorcode;
  61.  
  62.    graphdriver = DETECT;
  63.  
  64.    initgraph (&graphdriver, &graphmode, graphicspath);
  65.  
  66.    errorcode = graphresult ();
  67.    if (errorcode != grOk) {
  68.          printf ("\nGraphics System Error: %s\n",grapherrormsg (errorcode));
  69.          exit (1);
  70.       }
  71. }
  72.  
  73.  
  74. putpoint (int x, int y, int color, int writemode)
  75. {
  76.    int currentcolor;  /* current color of the point being written */
  77.  
  78.    currentcolor = getpixel (x,y);
  79.  
  80.    switch (writemode)   {
  81.          case COPY_PUT:
  82.             break;  /* do nothing -- color stays the same */
  83.  
  84.          case XOR_PUT:
  85.             color = xor_bits (color, currentcolor); break;
  86.  
  87.          case OR_PUT:
  88.             color = color | currentcolor; break;
  89.  
  90.          case AND_PUT:
  91.             color = color & currentcolor; break;
  92.  
  93.          case NOT_PUT:
  94.             color = ~color; break;
  95.       }
  96.  
  97.    putpixel (x, y, color);
  98. }
  99.  
  100. void triangle (int x, int y, unsigned radius)
  101. {
  102.    unsigned x1, y1;
  103.    unsigned x2, y2;
  104.    unsigned x3, y3;
  105.  
  106.    x1 = x;
  107.    y1 = y - radius;
  108.  
  109.    x2 = x + cos (330)*radius;
  110.    y2 = y + sin (330)*radius;
  111.  
  112.    x3 = x - cos (210)*radius;
  113.    y3 = y + sin (210)*radius;
  114.  
  115.    line (x1, y1, x2, y2);
  116.    line (x1, y1, x3, y3);
  117.    line (x2, y2, x3, y3);
  118.  
  119. }
  120.  
  121.  void graph_function (double (*f) (double arg), double lower_bound, double upper_bound, double step)  
  122. {
  123.  
  124.    int max_x, max_y;
  125.    int center_x, center_y;
  126.    int increment;
  127.    int point_count;
  128.    double *data;
  129.    double current_value;
  130.    int i;
  131.    double minimum_y, maximum_y;
  132.    double y_range;
  133.    double y_factor;
  134.  
  135.    int x_skip;
  136.    int skip_values;
  137.  
  138.    max_x = getmaxx ();
  139.    max_y = getmaxy ();
  140.  
  141.    center_x = max_x / 2;
  142.    center_y = max_y / 2;
  143.  
  144.    cleardevice ();
  145.  
  146.    /* draw the coordinate axes */
  147.  
  148.    line (center_x, 0, center_x, max_y);
  149.    line (0, center_y, max_x, center_y);
  150.  
  151.    point_count = (upper_bound-lower_bound)/step;
  152.  
  153.  
  154.  
  155.    data = (double *) calloc (point_count, sizeof (double));
  156.  
  157.    minimum_y = (*f) (lower_bound);
  158.    maximum_y = (*f) (lower_bound);
  159.  
  160.    for (i = 0, current_value = lower_bound; i < point_count; i++, current_value += step)   {
  161.          data [i] = (*f) (current_value);
  162.  
  163.          if (data [i] < minimum_y)
  164.             minimum_y = data [i];
  165.  
  166.          if (data [i] > maximum_y)
  167.             maximum_y = data [i];
  168.       }
  169.  
  170.    y_range = maximum_y - minimum_y;
  171.    y_factor = y_range;
  172.  
  173.  
  174. }
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.