Professional Documents
Culture Documents
}
double EndPt(int ii){
if(which == 1) return P[3][ii]; /*P4*/
else
return P[2][ii]; /*P3*/
}
double StartTan(int ii){
if(which == 0){
return((1-tension)*(P[1][ii] - P[0][ii]) ); }
if(which == 1){
return( 3*(1-tension)*(P[1][ii] - P[0][ii]) );
}
if(which == 2){
return((1-tension)*(P[2][ii] - P[0][ii]) /2 );
}
else return 0.0;
}
double EndTan(int ii){
if(which == 0){
return((1-tension)*(P[3][ii] - P[2][ii]) ); }
if(which == 1){
return( 3*(1-tension)*(P[3][ii] - P[2][ii]) );
}
if(which == 2){
return((1-tension)*(P[3][ii] - P[1][ii])/2 ); }
else return 0.0;
}
/*****************************************************************\
Spline Drawing routine:
Calls formulae for input.
\**********************/
void Spline(){
int ii;
double R,G,B,t, vv[2];
double inc;
inc = NUMSTEPS;
R = 1.0; G = 0.7; B = 0.0;
for(t=0; t<=1; t+=inc){
for(ii=0;ii<2;ii++){
vv[ii] = ((2*t*t*t)-(3*t*t)+1)*StartPt(ii)
+ ((-2*t*t*t)+(3*t*t))*EndPt(ii)
+ ((t*t*t)-(2*t*t)+t)*StartTan(ii)
+ ((t*t*t)-(t*t))*EndTan(ii);
}
R -= t * 0.08;
B += t * 0.08;
glColor3d(R,G,B);
glVertex2dv(vv);
}
}
/*****************************************************************\
draw_splines():encloses point generation routines.
\**********************/
void draw_splines(){
glBegin(GL_LINE_STRIP);
Spline();
glEnd();
}
/***************************/
/* General Glut Functions: */
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslated((200),(200),0);
glScaled(scale,scale,1);/* Zoom */
glTranslated((-T_X),(-T_Y),0); /* move */
/* Draw Here */
if(which == 0){ arrow(P[0],P[1]); arrow(P[2],P[3]); }
draw_splines();
draw_points();
glPopMatrix();
glutSwapBuffers();
}
void init (void) {
/*General Init: */
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,400,400,0);
glMatrixMode(GL_MODELVIEW);
/* Call specific Init: */
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POINT_SMOOTH);
}
void idle (void){
/* General: */
if(refresh){
refresh = !refresh;
glutPostRedisplay();
}
}
void keyboard(unsigned char dakey, int x, int y) {
switch (dakey) {
case '1':
which = 0;
glutPostRedisplay();
break;
case '2':
which = 1;
glutPostRedisplay();
break;
case '3':
which = 2;
glutPostRedisplay();
break;
/***************************/
/* Zoom and View Controls: */
case 'i':
refresh = !refresh; T_Y -= 25;
case 'k':
refresh = !refresh; T_Y += 25;
case 'l':
refresh = !refresh; T_X += 25;
case 'j':
refresh = !refresh; T_X -= 25;
case 'x': case '.' :
refresh = !refresh;
scale += 0.10; break;
case 'z': case ',' :
refresh = !refresh;
scale -= 0.10; break;
default: break;
glutPostRedisplay(); break;
glutPostRedisplay(); break;
glutPostRedisplay(); break;
glutPostRedisplay(); break;
}
}
void menu(int value) {
switch(value) {
case 3:
P[0][0] = 0;P[0][1] = 0;P[1][0] = 50; P[1][1] = 250;
P[2][0] = 300; P[2][1] = 300; P[3][0] = 350; P[3][1] = 550;
T_Y = 275.0000; T_X = 200.0000;
scale = 0.5;
tension = 0.0;
which = 0;
glutPostRedisplay();
break;
case 4: exit(0); break;
}
}
void TensionMenu(int value) {
switch(value) {
case 101: tension = -2.0; glutPostRedisplay(); break;
case 102: tension = -1.0; glutPostRedisplay(); break;
case 103: tension = -0.5; glutPostRedisplay(); break;
case 104: tension = 0.0; glutPostRedisplay(); break;
case 105: tension = 0.2; glutPostRedisplay(); break;
case 106: tension = 0.4; glutPostRedisplay(); break;
case 107: tension = 0.6; glutPostRedisplay(); break;
case 108: tension = 0.8; glutPostRedisplay(); break;
case 109: tension = 1.0; glutPostRedisplay(); break;
case 110: tension = 2.0; glutPostRedisplay(); break;
int ii;
switch(button){
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN){
for(ii=0; ii<4; ii++) {
if ( (( ( ((Mx-200) / scale) + T_X)) >
(P[ii][0]-10) )&&
(( ( ((Mx-200) / scale) + T_X))
< (P[ii][0]+10) )&&
(( ( ((My-200) / scale) + T_Y))
> (P[ii][1]-10) )&&
(( ( ((My-200) / scale)
+ T_Y)) < (P[ii][1]+10)) ){
move = ii;
break;
}
else move = 4;
/*
Nifty and extremely complex
scaling tests...
means you can zoom in and still control
the points
and the mouse motion will match the
point's motion
took me two hours to work this out...
Make that FOUR...
((It's((a((Paren(thet(ic(al((Ni(g(h)T)m)a)r)e)).).).) )!)!)!)
*/
} /* for */
} /* if */
break;
}
}
void MouseMove(int newx, int newy){
if(move != 4){
P[move][0] = ((newx-200) / scale) + T_X;
P[move][1] = ((newy-200) / scale) + T_Y;
refresh = !refresh;
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (400, 400);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Splines");
init();
glutDisplayFunc(display);
glutIdleFunc(idle);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(MouseMove);
MakeMenu();
glutMainLoop();
return 0;/* ANSI C requires main to return int. */
}