/* 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
*/
The crvn subroutine.
Drawing Curves in GL3.2 Version 4 for AIX: Programming Concepts.