/* Example: curve3.c
This program draw a Bezier curve segment using curveit(). The Cardinal spline and B-spline curve segments could be drawn in a similar manner (only the basis matrix would be different). */
#include <gl/gl.h> #include <gl/device.h>
#define BEZIER 1
Matrix beziermatrix = {
{ -1.0, 3.0, -3.0, 1.0 } ,
{ 3.0, -6.0, 3.0, 0.0 },
{ -3.0, 3.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0, 0.0 }};
Matrix geom1 = {
{ 50.0, 150.0, 0.0, 1.0},
{ 150.0, 225.0, 0.0, 1.0},
{ 150.0, 075.0, 0.0, 1.0},
{ 250.0, 150.0, 0.0, 1.0}};
Matrix precisionmatrix = {
{ 6.0/8000.0, 0.0, 0.0, 0.0},
{ 6.0/8000.0, 2.0/400.0, 0.0, 0.0},
{ 1.0/8000.0, 1.0/400.0, 1/20.0, 0.0},
{ 0.0, 0.0, 0.0, 1.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, 500, 100, 400);
gid = winopen("curve3");
winconstraints();
qdevice(ESCKEY);
qdevice(REDRAW);
qenter(REDRAW,gid);
}
drawcurve()
{
int i,xx,yy;
color(BLACK);
clear();
pushmatrix(); /* the current transformation
* matrix on the matrix stack is
* saved */
multmatrix(geom1); /* the product of the current
* transformation matrix and the
* matrix containing the
* control points becomes the new
* current transformation matrix */
multmatrix(beziermatrix); /* the product of the basis
* matrix and the current
* transformation matrix becomes
* the new current transformation
* matrix */
multmatrix(precisionmatrix); /* the product of the precision
* matrix and the current
* transformation matrix
* becomes the new current
* transformation matrix */
move(0.0,0.0,0.0); /* this command must be issued
* so that the correct first
* point is generated by the
* curveit command */
color(RED);
curveit(20); /* a curve consisting of 20 line
* segments is drawn */
popmatrix(); /* the original transformation
* matrix is restored */
/* show the control points */
color(WHITE);
for ( i = 0 ; i < 4 ; i++ ) {
for ( xx = -2 ; xx < 2 ; xx++) {
for ( yy = -2 ; yy < 2 ; yy++) {
pnt2( geom1[i][0] + (Coord) xx , geom1[i][1] + (Coord) yy);
}
}
}
}
/*
Changes:
- the control points are drawn on the screen
- added winconstraints() so the window could be resized
- changes the geometry so it would be centered
from:
Matrix geom1 = {
{ 100.0, 100.0, 0.0, 1.0},
{ 200.0, 200.0, 0.0, 1.0},
{ 200.0, 0.0, 0.0, 1.0},
{ 300.0, 100.0, 0.0, 1.0}};
to:
Matrix geom1 = {
{ 100.0, 150.0, 0.0, 1.0},
{ 200.0, 225.0, 0.0, 1.0},
{ 200.0, 075.0, 0.0, 1.0},
{ 300.0, 150.0, 0.0, 1.0}};
*/
The curveit subroutine, the multmatrix subroutine.
Drawing Curves in GL3.2 Version 4 for AIX: Programming Concepts.