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

patch1.c Example C Language Program

/* Example C Language Program patch1.c */
/*
This program draws three surface patches. First, one based on
Bezier curves, then one based on B-Spline curves, and
finally one based on Cardinal curves.
*/
#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 geomx[4][4] = {
  {   0.0, 100.0, 200.0, 300.0} ,
  {   0.0, 100.0, 200.0, 300.0},
  { 700.0, 600.0, 500.0, 400.0},
  { 700.0, 600.0, 500.0, 400.0}};
Coord geomy[4][4] = { 
  { 400.0, 500.0, 600.0, 700.0},
  {   0.0, 100.0, 200.0, 300.0},
  {   0.0, 100.0, 200.0, 300.0},
  { 400.0, 500.0, 600.0, 700.0}};
Coord geomz[4][4] = { 
  { 100.0, 200.0, 300.0, 400.0 },
  { 100.0, 200.0, 300.0, 400.0 },
  { 100.0, 200.0, 300.0, 400.0 },
  { 100.0, 200.0, 300.0, 400.0 }};
main()
{
  Device dev;
  short val;    
  initialize();    
  while (TRUE) {        
    if (qtest()) {
      dev = qread(&val);            
      if (dev == ESCKEY) {
        gexit();
        exit();
      }
      else if (dev == REDRAW) {
        reshapeviewport();
        drawpatch();
      }
    }
  }
}
initialize()
{
  int gid;    
  prefsize(400,400);
  gid = winopen("patch1");    
  qdevice(ESCKEY);
  qdevice(REDRAW);
  qenter(REDRAW,gid);    
  ortho(-100.0, 800.0, -100.0, 800.0, -800.0, 100.0);
}
drawpatch()
{
  int i,j,xx,yy;
  color(BLACK);
  clear();   
  defbasis(BEZIER, beziermatrix);    /* define a basis matrix 
                                        called BEZIER */
  defbasis(CARDINAL,cardinalmatrix); /* define a basis matrix 
                                        called CARDINAL */
  defbasis(BSPLINE,bsplinematrix);   /* define a basis matrix 
                                        called BSPLINE */
  patchbasis(BEZIER,BEZIER);     /* a Bezier basis will be used 
                                    for both directions in the 
                                    first patch */
  patchcurves(4,7);              /* seven curve segments will be 
                                    drawn in the u direction and 
                                    four in the v direction */
  patchprecision(20,20);         /* the curve segments in u 
                                    direction will consist of 20 
                                    line segments (the lowest 
                                    multiple of vcurves greater 
                                    than usegments) and the curve
                                    segments in the v direction 
                                    will consist of 21 line 
                                    segments (the lowest multiple
                                    of ucurves greater than 
                                    vsegments) */
  color(RED);
  patch(geomx,geomy,geomz);      /* the patch is drawn based on 
                                    the sixteen specified control
                                    points */
  patchbasis(CARDINAL,CARDINAL); /* the bases for both directions
                                    are reset */
  color(GREEN);
  patch(geomx,geomy,geomz);      /* another patch is drawn using 
                                    the same control points but a
                                    different basis */
  patchbasis(BSPLINE,BSPLINE);   /* the bases for both directions
                                    are reset again */
  color(BLUE);
  patch(geomx,geomy,geomz);      /* a third patch is drawn */
  color(WHITE);                  /* show the control points */
  for ( i = 0 ; i < 4 ; i++ )  {
    for ( j = 0 ; j < 4 ; j++ )  {
         for ( xx = -2 ; xx < 2 ; xx++) {
            for ( yy = -2 ; yy < 2 ; yy++) {
               pnt( geomx[i][j] + (Coord) xx , geomy[i][j] + (Coord) yy ,
               geomz[i][j] );
        }
      }
    }
  }
}
/*
  Changes:
     - The prefposition changed to a prefsize (400,400);
       Was:  prefposition(XMAXSCREEN/4, XMAXSCREEN*3/4, YMAXSCREEN/4, 
             YMAXSCREEN*3/4);
     - The ortho parameters where changed
          ortho(0.0-20.0, (float)(XMAXSCREEN*3/4), 
              0.0-20.0, (float)(YMAXSCREEN*3/4), 
              (float)XMAXSCREEN, -(float)XMAXSCREEN);
       Now:
          ortho(-100.0, 800.0, -100.0, 800.0, -800.0, 100.0);
*/

Related Information

The patch subroutine, patchbasis subroutine, patchcurves subroutine, patchprecision subroutine.

Drawing Surfaces in GL3.2 Version 4 for AIX: Programming Concepts describes the mathematics and programming statements involved in creating three-dimensional surfaces (or patches) with wire frames of curve segments.


[ Previous | Next | Contents | Glossary | Home | Search ]