[ Next Article | Previous Article | Book Contents | Library Home | Legal | Search ]
GL3.2 for AIX: Graphics Library (GL) Technical Reference

curve2.c Example C Language Program

/*
curve2.c
This program demonstrates the use of joined curve segments. It
draws three curves. One with a Bezier basis, one with a Cardinal
spline basis, and one with a B-spline basis.
The array geom2 contains 6 control points.  With the Bezier basis
matrix, 3 sets of overlapping control points result in 3 separate
curve segments.  With the Cardinal spline and B-spline matrices,
the same overlapping sets of control points result in 3 joined
curve segments.
*/
#include <gl/gl.h>
#include <gl/device.h>
Matrix beziermatrix = {
  { -1,  3, -3,  1 } ,
  {  3, -6,  3,  0 },
  { -3,  3,  0,  0 },
  {  1,  0,  0,  0 }};
Matrix cardinalmatrix = { 
  { -0.5,  1.5, -1.5,  0.5 },
  {  1.0, -2.5,  2.0, -0.5 },
  { -0.5,  0.0,  0.5,  0.0 },
  {  0.0,  1.0,  0.0,  0.0 }};
Matrix bsplinematrix = { 
  { -1.0/6.0,  3.0/6.0, -3.0/6.0, 1.0/6.0 },
  {  3.0/6.0, -6.0/6.0,  3.0/6.0,    0.0 },
  { -3.0/6.0,      0.0,  3.0/6.0,    0.0 },
  {  1.0/6.0,  4.0/6.0,  1.0/6.0,    0.0 }};
#define BEZIER 1
#define CARDINAL 2
#define BSPLINE 3
Coord geom2[6][3] = {
  { 150.0, 400.0, 0.0},
  { 350.0, 100.0, 0.0},
  { 200.0, 350.0, 0.0},
  {  50.0,   0.0, 0.0},
  {   0.0, 200.0, 0.0},
  { 100.0, 300.0, 0.0}};
main()
{    
  int dev,val;    
  initialize();    
  while (TRUE) {
    if (qtest()) {            
      dev = qread(&val);            
      if (dev == ESCKEY) {
        gexit();
        exit();
      }
      else if (dev == REDRAW) {
        reshapeviewport();
        drawcurve();
      }
    }
  }
}
initialize()
{    
  int gid;    
  prefposition(200, 650, 200, 800);
  gid = winopen("curve2");    
  winconstraints();                  /* Allows resizing */
  qdevice(ESCKEY);
  qdevice(REDRAW);
  qenter(REDRAW,gid);
}
drawcurve()
{    
  short i,xx,yy;
  color(BLACK);
  clear();    
  pushmatrix();                      /* Copy the top matrix */
  translate (50.0,100.0,0.0);        /* Center the splines */
  defbasis(BEZIER,beziermatrix);     /* define a basis matrix 
                                        called BEZIER */
  defbasis(CARDINAL,cardinalmatrix); /* a new basis is 
                                        defined */
  defbasis(BSPLINE,bsplinematrix);   /* a new basis is 
                                        defined */
  curvebasis(BEZIER);      /* the Bezier matrix becomes the 
                              current basis */
  curveprecision(20);      /* the precision is set to 20 */
  color(RED);
  crvn(6, geom2);          /* the curvs command called with a 
                              Bezier basis causes 3 separate 
                              curve segments to be drawn */
  curvebasis(CARDINAL);    /* the Cardinal basis becomes the 
                              current basis */
  color(GREEN);
  crvn(6, geom2);          /* the crvs command called with a 
                              Cardinal spline basis causes a 
                              smooth curve to be drawn */
  curvebasis(BSPLINE);     /* the B-spline basis becomes the 
                              current basis */
  color(BLUE);
  crvn(6, geom2);          /* the curvs command called with a 
                              B-spline basis causes the 
                              smoothest curve to be drawn */
    /* show the control points */
  color(WHITE);
  for ( i = 0 ; i < 6 ; i++ )  {
    for ( xx = -2 ; xx < 2 ; xx++) {
      for ( yy = -2 ; yy < 2 ; yy++) {
        pnt2( geom2[i][0] + (Coord) xx , geom2[i][1] + (Coord) yy);
      }
    }
  }
  popmatrix();
}
/*
  Changes:
      - Now the control points are displayed
    - The window can be resized
*/

Related Information

The crvn subroutine .

Drawing Curves in GL3.2 Version 4 for AIX: Programming Concepts.


[ Next Article | Previous Article | Book Contents | Library Home | Legal | Search ]