[ Previous | Next | Contents | Glossary | Home | 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()) {
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.

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