home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / VOGLE / EXAMPLES / PCURVES.P < prev    next >
Text File  |  2000-02-11  |  5KB  |  245 lines

  1. program curves;
  2. (*
  3.  * using curves
  4.  *)
  5.  
  6. #include 'Vogle.h'
  7.  
  8. var    bezier, cardinal, bspline: Matrix44_t;
  9.     geom1: Matrix43_t;
  10.     geom2: GeomMat_t;
  11.     dev: string_t;
  12.     c: char;
  13.     i: integer;
  14.  
  15.     procedure init;
  16.     begin
  17.         (*
  18.          * curve basis types
  19.          *)
  20.         bezier[1, 1] := -1.0;
  21.         bezier[1, 2] :=  3.0;
  22.         bezier[1, 3] := -3.0;
  23.         bezier[1, 4] :=  1.0;
  24.         bezier[2, 1] :=  3.0; 
  25.         bezier[2, 2] := -6.0;
  26.         bezier[2, 3] :=  3.0;
  27.         bezier[2, 4] :=  0.0;
  28.         bezier[3, 1] := -3.0;
  29.         bezier[3, 2] :=  3.0;
  30.         bezier[3, 3] :=  0.0;
  31.         bezier[3, 4] :=  0.0;
  32.         bezier[4, 1] :=  1.0;
  33.         bezier[4, 2] :=  0.0;
  34.         bezier[4, 3] :=  0.0;
  35.         bezier[4, 4] :=  0.0;
  36.  
  37.         cardinal[1, 1] := -0.5;
  38.         cardinal[1, 2] :=  1.5;
  39.         cardinal[1, 3] := -1.5;
  40.         cardinal[1, 4] :=  0.5;
  41.         cardinal[2, 1] :=  1.0;
  42.         cardinal[2, 2] := -2.5;
  43.         cardinal[2, 3] :=  2.0;
  44.         cardinal[2, 4] := -0.5;
  45.         cardinal[3, 1] := -0.5;
  46.         cardinal[3, 2] :=  0.0;
  47.         cardinal[3, 3] :=  0.5;
  48.         cardinal[3, 4] :=  0.0;
  49.         cardinal[4, 1] :=  0.0;
  50.         cardinal[4, 2] :=  1.0;
  51.         cardinal[4, 3] :=  0.0;
  52.         cardinal[4, 4] :=  0.0;
  53.  
  54.         
  55.         bspline[1, 1] := -0.166666;
  56.         bspline[1, 2] :=  0.5;
  57.         bspline[1, 3] := -0.5;
  58.         bspline[1, 4] :=  0.166666;
  59.         bspline[2, 1] :=  0.5;
  60.         bspline[2, 2] := -1.0;
  61.         bspline[2, 3] :=  0.5;
  62.         bspline[2, 4] :=  0.0;
  63.         bspline[3, 1] := -0.5;
  64.         bspline[3, 2] :=  0.0;
  65.         bspline[3, 3] :=  0.5;
  66.         bspline[3, 4] :=  0.0;
  67.         bspline[4, 1] :=  0.166666;
  68.         bspline[4, 2] :=  0.666666;
  69.         bspline[4, 3] :=  0.166666;
  70.         bspline[4, 4] :=  0.0;
  71.  
  72.         (*
  73.          *     Geometry matrix to demonstrate basic spline segments
  74.          *)
  75.  
  76.         geom1[1, 1] := -180.0;
  77.         geom1[1, 2] :=   10.0;
  78.         geom1[1, 3] :=    0.0;
  79.         geom1[2, 1] := -100.0;
  80.         geom1[2, 2] :=  110.0;
  81.         geom1[2, 3] :=    0.0;
  82.         geom1[3, 1] := -100.0;
  83.         geom1[3, 2] :=  -90.0;
  84.         geom1[3, 3] :=    0.0;
  85.         geom1[4, 1] :=    0.0;
  86.         geom1[4, 2] :=   50.0;
  87.         geom1[4, 3] :=    0.0;
  88.         (*
  89.          *     Geometry matrix to demonstrate overlapping control 
  90.          *    points to produce continuous (Well, except for the
  91.          *     bezier ones) curves from spline segments.
  92.          *)
  93.  
  94.         geom2[1, 1] := 200.0;
  95.         geom2[1, 2] := 480.0;
  96.         geom2[1, 3] :=   0.0;
  97.         geom2[2, 1] := 380.0;
  98.         geom2[2, 2] := 180.0;
  99.         geom2[2, 3] :=   0.0;
  100.         geom2[3, 1] := 250.0;
  101.         geom2[3, 2] := 430.0;
  102.         geom2[3, 3] :=   0.0;
  103.         geom2[4, 1] := 100.0;
  104.         geom2[4, 2] := 130.0;
  105.         geom2[4, 3] :=   0.0;
  106.         geom2[5, 1] :=  50.0;
  107.         geom2[5, 2] := 280.0;
  108.         geom2[5, 3] :=   0.0;
  109.         geom2[6, 1] := 150.0;
  110.         geom2[6, 2] := 380.0;
  111.         geom2[6, 3] :=   0.0
  112.     end;
  113.  
  114. begin
  115.     init;
  116.  
  117.     write('Enter device: ');
  118.     readln(dev);
  119.  
  120.     Vinit(dev);
  121.  
  122.     Ortho2(-200.0, 400.0, -100.0, 500.0);
  123.  
  124.     Color(BLACK);
  125.     Clear;
  126.  
  127.     Color(YELLOW);
  128.  
  129.     TextSize(10.0, 10.0);
  130.  
  131.     (*
  132.      * label the control points in geom1
  133.      *)
  134.     for i := 1 to 4 do begin
  135.         Move2(geom1[i, 1], geom1[i, 2]);
  136.         c := chr(ord('0') + i);
  137.         DrawChar(c)
  138.     end;
  139.                                  
  140.     (*
  141.      * label the control points in geom2
  142.      *)
  143.     for i := 1 to 6 do begin
  144.         Move2(geom2[i, 1], geom1[i, 2]);
  145.         c := chr(ord('0') + i);
  146.         DrawChar(c)
  147.  
  148.     end;
  149.  
  150.     (*
  151.      * scale the current font so that 30 of the largest characters
  152.      * in the current font will fit in a region 300 world units wide,
  153.      * 20 high.
  154.      *)
  155.     BoxFit(300.0, 20.0, 30);
  156.  
  157.     (*
  158.      * set the number of line segments appearing in each curve to 20
  159.      *)
  160.     CurvePrecision(20);
  161.  
  162.     (*
  163.      * copy the bezier basis matrix into the curve basis matrix.
  164.      *)
  165.     CurveBasis(bezier);
  166.  
  167.     Color(RED);
  168.  
  169.     (*
  170.      * draw a curve using the current basis matrix (bezier in this case)
  171.      * and the control points in geom1
  172.      *)
  173.     Curve(geom1);
  174.  
  175.     Move2(70.0, 60.0);
  176.     DrawStr('Bezier Curve Segment');
  177.  
  178.     Move2(-190.0, 450.0);
  179.     DrawStr('Three overlapping Bezier Curves');
  180.  
  181.     (*
  182.      * curven draws overlapping curve segments according to geom2, the
  183.      * number of curve segments drawn is three less than the number of
  184.      * points passed, assuming there are a least four points in the
  185.      * geometry matrix (in this case geom2). This call will draw 3
  186.      * overlapping curve segments in the current basis matrix - still
  187.      * bezier.
  188.      *)
  189.     Curven(6, geom2);
  190.  
  191.     i := GetKey;
  192.  
  193.     (*
  194.      * load in the cardinal basis matrix
  195.      *)
  196.     CurveBasis(cardinal);
  197.  
  198.     Color(MAGENTA);
  199.  
  200.     Move2(70.0, 10.0);
  201.     DrawStr('Cardinal Curve Segment');
  202.  
  203.     (*
  204.      * plot out a curve segment using the cardinal basis matrix
  205.      *)
  206.     Curve(geom1);
  207.  
  208.     Move2(-190.0, 400.0);
  209.     DrawStr('Three overlapping Cardinal Curves');
  210.  
  211.     (*
  212.      * now draw a bunch of them again.
  213.      *)
  214.     Curven(6, geom2);
  215.  
  216.     i := GetKey;
  217.  
  218.     (*
  219.      * change the basis matrix again
  220.      *)
  221.     CurveBasis(bspline);
  222.  
  223.     Color(GREEN);
  224.  
  225.     Move2(70.0, -40.0);
  226.     DrawStr('Bspline Curve Segment');
  227.  
  228.     (*
  229.      * now draw our curve segment in the new basis...
  230.      *)
  231.     Curve(geom1);
  232.  
  233.     Move2(-190.0, 350.0);
  234.     DrawStr('Three overlapping Bspline Curves');
  235.  
  236.     (*
  237.      * ...and do some overlapping ones
  238.      *)
  239.     Curven(6, geom2);
  240.  
  241.     i := GetKey;
  242.  
  243.     Vexit
  244. end.
  245.