home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / EXAMPLES / MSWIN / CURVES.C < prev    next >
C/C++ Source or Header  |  1994-04-27  |  3KB  |  184 lines

  1. #include <stdio.h>
  2. #include "vogle.h"
  3.  
  4. /*
  5.  * curve basis types
  6.  */
  7. Matrix    bezier = {
  8.     {-1.0,    3.0,    -3.0,    1.0},
  9.     {3.0,    -6.0,    3.0,    0.0},
  10.     {-3.0,    3.0,    0.0,    0.0},
  11.     {1.0,    0.0,    0.0,    0.0} 
  12. };
  13.  
  14. Matrix    cardinal = {
  15.     {-0.5,    1.5,    -1.5,    0.5},
  16.     {1.0,    -2.5,    2.0,    -0.5},
  17.     {-0.5,    0.0,    0.5,    0.0},
  18.     {0.0,    1.0,    0.0,    0.0}
  19. };
  20.  
  21. Matrix    bspline = {
  22.     {-1.0 / 6.0,    3.0 / 6.0,    -3.0 / 6.0,    1.0 / 6.0},
  23.     {3.0 / 6.0,    -6.0 / 6.0,    3.0 / 6.0,    0.0},
  24.     {-3.0 / 6.0,    0.0,        3.0 / 6.0,    0.0},
  25.     {1.0 / 6.0,    4.0 / 6.0,    1.0 / 6.0,    0.0}    
  26. };
  27.  
  28. /*
  29.  *     Geometry matrix to demonstrate basic spline segments
  30.  */
  31. float   geom1[4][3] = {
  32.     { -180.0, 10.0, 0.0 },
  33.     { -100.0, 110.0, 0.0 },
  34.     { -100.0, -90.0, 0.0 },
  35.     { 0.0, 50.0, 0.0 }
  36. };
  37.  
  38. /*
  39.  *     Geometry matrix to demonstrate overlapping control points to
  40.  *    produce continuous (Well, except for the bezier ones) curves
  41.  *    from spline segments
  42.  */
  43. float    geom2[6][3] = {
  44.     { 200.0, 480.0, 0.0 },
  45.     { 380.0, 180.0, 0.0 },
  46.     { 250.0, 430.0, 0.0 },
  47.     { 100.0, 130.0, 0.0 },
  48.     { 50.0,  280.0, 0.0 },
  49.     { 150.0, 380.0, 0.0 }
  50. };
  51.  
  52. /*
  53.  * using curves
  54.  */
  55. main()
  56. {
  57.     char    dev[20];
  58.     int    i;
  59.  
  60.     vinit("mswin");
  61.  
  62.     ortho2(-200.0, 400.0, -100.0, 500.0);
  63.  
  64.     color(BLACK);
  65.     clear();
  66.  
  67.     color(YELLOW);
  68.  
  69.     textsize(10.0, 10.0);
  70.  
  71.     /*
  72.      * label the control points in geom1
  73.      */
  74.         for (i = 0; i < 4; i++) {
  75.         move2(geom1[i][0], geom1[i][1]);
  76.         sprintf(dev, "%d", i);
  77.         drawstr(dev);
  78.     }
  79.                                  
  80.     /*
  81.      * label the control points in geom2
  82.      */
  83.     for (i = 0; i < 6; i++) {
  84.         move2(geom2[i][0], geom2[i][1]);
  85.         sprintf(dev, "%d", i);
  86.         drawstr(dev);
  87.     }
  88.  
  89.     /*
  90.      * scale the current font so that 30 of the largest characters
  91.      * in the current font will fit in a region 300 world units wide,
  92.      * 20 high.
  93.      */
  94.     boxfit(300.0, 20.0, 30);
  95.  
  96.     /*
  97.      * set the number of line segments appearing in each curve to 20
  98.      */
  99.     curveprecision(20);
  100.  
  101.     /*
  102.      * copy the bezier basis matrix into the curve basis matrix.
  103.      */
  104.     curvebasis(bezier);
  105.  
  106.     color(RED);
  107.  
  108.     /*
  109.      * draw a curve using the current basis matrix (bezier in this case)
  110.      * and the control points in geom1
  111.      */
  112.     curve(geom1);
  113.  
  114.     move2(70.0, 60.0);
  115.     drawstr("Bezier Curve Segment");
  116.  
  117.     move2(-190.0, 450.0);
  118.     drawstr("Three overlapping Bezier Curves");
  119.  
  120.     /*
  121.      * curven draws overlapping curve segments according to geom2, the
  122.      * number of curve segments drawn is three less than the number of
  123.      * points passed, assuming there are a least four points in the
  124.      * geometry matrix (in this case geom2). This call will draw 3
  125.      * overlapping curve segments in the current basis matrix - still
  126.      * bezier.
  127.      */
  128.     curven(6, geom2);
  129.  
  130.     getkey();
  131.  
  132.     /*
  133.      * load in the cardinal basis matrix
  134.      */
  135.     curvebasis(cardinal);
  136.  
  137.     color(MAGENTA);
  138.  
  139.     move2(70.0, 10.0);
  140.     drawstr("Cardinal Curve Segment");
  141.  
  142.     /*
  143.      * plot out a curve segment using the cardinal basis matrix
  144.      */
  145.     curve(geom1);
  146.  
  147.     move2(-190.0, 400.0);
  148.     drawstr("Three overlapping Cardinal Curves");
  149.  
  150.     /*
  151.      * now draw a bunch of them again.
  152.      */
  153.     curven(6, geom2);
  154.  
  155.     getkey();
  156.  
  157.     /*
  158.      * change the basis matrix again
  159.      */
  160.     curvebasis(bspline);
  161.  
  162.     color(GREEN);
  163.  
  164.     move2(70.0, -40.0);
  165.     drawstr("Bspline Curve Segment");
  166.  
  167.     /*
  168.      * now draw our curve segment in the new basis...
  169.      */
  170.     curve(geom1);
  171.  
  172.     move2(-190.0, 350.0);
  173.     drawstr("Three overlapping Bspline Curves");
  174.  
  175.     /*
  176.      * ...and do some overlapping ones
  177.      */
  178.     curven(6, geom2);
  179.  
  180.     getkey();
  181.  
  182.     vexit();
  183. }
  184.