/* 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);
*/
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.