///////////////////////////////////////////////////
///////////////////////////////////////////////////
//
//fhwork is made by fh and his classmates
//2004.7.8
//
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
//////////////////////////////////////////
#define Width_Normal 1
#define Width_Thicker 2
#define Width_Thickest 3
#define iColor_Red 4
#define iColor_Green 5
#define iColor_White 6
#define iColor_Yellow 7
#define iColor_Blue 8
#define iFillIN_No 9
#define iFillIN_Single 10
#define iFillIN_Transition 11
// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
int iWidth = Width_Normal;
int iColor = iColor_Green;
int iFillIN = iFillIN_No;
GLfloat i=0;
//bezier's points
GLint nNumPoints = 6;
GLfloat ctrlPoints_Right[6][3] = {{ 20.0f, 70.0f, 0.0f}, // End Point
{ 15.0f, 50.0f, 0.0f}, // Control Point
{ 5.0f, 20.0f, 0.0f}, // Control Point
{ 70.0f, 0.0f, 0.0f}, // Control Point
{ 40.0f, -40.0f, 0.0f}, // Control Point
{ 30.0f, -70.0f, 0.0f }}; // End Point
GLfloat ctrlPoints_Left[6][3] = {{ -20.0f, 70.0f, 0.0f}, // End Point
{ -15.0f, 50.0f, 0.0f}, // Control Point
{ -5.0f, 20.0f, 0.0f}, // Control Point
{ -70.0f, 0.0f, 0.0f}, // Control Point
{ -40.0f, -40.0f, 0.0f}, // Control Point
{ -30.0f, -70.0f, 0.0f }}; // End Point
// This function does any needed initialization on the rendering context.
void ProcessMenu(int value)
{
switch(value)
{
case 1:
iWidth = Width_Normal;
break;
case 2:
iWidth = Width_Thicker;//中
break;
case 3:
iWidth = Width_Thickest;//粗
break;
case 4:
iColor = iColor_Red;
break;
case 5:
iColor = iColor_Green;
break;
case 6:
iColor = iColor_White;
break;
case 7:
iColor = iColor_Yellow;
break;
case 8:
iColor = iColor_Blue;
break;
case 9:
iFillIN = iFillIN_No;
break;
case 10:
iFillIN = iFillIN_Single;
break;
case 11:
iFillIN = iFillIN_Transition;
break;
default:
break;
}
glutPostRedisplay();
}
// Called to draw scene
void RenderScene(void)
{
// Clear the window
glClear(GL_COLOR_BUFFER_BIT);
// Save matrix state and do the rotation
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
// Set the line width 线宽
if(iWidth == Width_Normal)
glLineWidth(1.0f);
if(iWidth == Width_Thicker)
glLineWidth(3.0f);
if(iWidth == Width_Thickest)
glLineWidth(5.0f);
// Set drawing color 颜色
if(iColor == iColor_Red)
glColor3f(1.0f, 0.0f, 0.0f);
if(iColor == iColor_Green)
glColor3f(0.0f, 1.0f, 0.0f);
if(iColor == iColor_White)
glColor3f(1.0f, 1.0f, 1.0f);
if(iColor == iColor_Yellow)
glColor3f(1.0f, 1.0f, 0.0f);
if(iColor == iColor_Blue)
glColor3f(0.0f, 0.0f, 1.0f);
//填充
if(iFillIN == iFillIN_No)
{
glShadeModel(GL_FLAT);
// Draw the line
glBegin(GL_LINES);
glVertex2f(-20.0f, 70.0f);
glVertex2f(20.0f, 70.0f);
glVertex2f(-30.0f, -70.0f);
glVertex2f(30.0f, -70.0f);
glEnd();
// Sets up the bezier
// This actually only needs to be called once and could go in
// the setup function
glMap1f(GL_MAP1_VERTEX_3, // Type of data generated
0.0f, // Lower u range
100.0f, // Upper u range
3, // Distance between points in the data
nNumPoints, // number of control points
&ctrlPoints_Right[0][0]); // array of control points
// Enable the evaluator
glEnable(GL_MAP1_VERTEX_3);
// Map a grid of 100 points from 0 to 100
glMapGrid1d(100,0.0,100.0);
// Evaluate the grid, using lines
glEvalMesh1(GL_LINE,0,100);
glMap1f(GL_MAP1_VERTEX_3, 0.0f, 100.0f, 3, nNumPoints, &ctrlPoints_Left[0][0]);
// Enable the evaluator
glEnable(GL_MAP1_VERTEX_3);
// Use higher level functions to map to a grid, then evaluate the
// entire thing.
// Map a grid of 100 points from 0 to 100
glMapGrid1d(100,0.0,100.0);
// Evaluate the grid, using lines
glEvalMesh1(GL_LINE,0,100);
//bezier end
}
if(iFillIN == iFillIN_Single)
{
glShadeModel(GL_FLAT);
glMap1f(GL_MAP1_VERTEX_3,0.0f,100.0f,3, nNumPoints, &ctrlPoints_Right[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_POLYGON);
glColor3f(0.0,1.0,1.0);
glVertex3f(0.0f,70.0f,0.0f);
for( i = 0; i <= 100; i++)
{
glEvalCoord1f((GLfloat) i);
}
glVertex3f(0.0f,-70.0f,0.0f);
glEnd();
glMap1f(GL_MAP1_VERTEX_3,
0.0f,
100.0f,
3,
nNumPoints,
&ctrlPoints_Left[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_POLYGON);
glColor3f(0.0,1.0,1.0);
glVertex3f(0.0f,70.0f,0.0f);
for( i = 0; i <= 100; i++)
{
glEvalCoord1f((GLfloat) i);
}
glVertex3f(0.0f,-70.0f,0.0f);
glEnd();
}
if(iFillIN == iFillIN_Transition)
{
glShadeModel(GL_SMOOTH);
glMap1f(GL_MAP1_VERTEX_3,
0.0f,
100.0f,
3,
nNumPoints,
&ctrlPoints_Right[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_POLYGON);
glColor3f(0.0,1.0,1.0);
glVertex3f(0.0f,70.0f,0.0f);
for( i = 0; i <= 100; i++)
{
glColor3f(i/100,i/150,i/200);
glEvalCoord1f((GLfloat) i);
}
glColor3f(1.0,1.0,1.0);
glVertex3f(0.0f,-70.0f,0.0f);
glEnd();
glMap1f(GL_MAP1_VERTEX_3,
0.0f,
100.0f,
3,
nNumPoints,
&ctrlPoints_Left[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_POLYGON);
glColor3f(1.0,0.0,0.5);
glVertex3f(0.0f,70.0f,0.0f);
for( i = 0; i <= 100; i++)
{
glColor3f(i/100,i/150,(i+100)/200);
glEvalCoord1f((GLfloat) i);
}
glColor3f(0.0,0.5,0.5);
glVertex3f(0.0f,-70.0f,0.0f);
glEnd();
}
// Restore transformations
glPopMatrix();
// Flush drawing commands
glutSwapBuffers();
}
void SetupRC()
{
// Black background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
// Set drawing color 颜色
glColor3f(0.0f, 1.0f, 0.0f);
//填充
glShadeModel(GL_SMOOTH);
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(key > 356.0f)
xRot = 0.0f;
if(key < -1.0f)
xRot = 355.0f;
if(key > 356.0f)
yRot = 0.0f;
if(key < -1.0f)
yRot = 355.0f;
// Refresh the Window
glutPostRedisplay();
}
void ChangeSize(int w, int h)
{
GLfloat nRange = 100.0f;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset projection matrix stack
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
// Reset Model view matrix stack
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
int nLinesWidthMenu;//线宽
int nLinesColorMenu;//颜色
int nLinesFillInMenu;//填充
int nMainMenu;//主菜单
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("冯奂(小组)的作业");
// Create the Menu
//线宽
nLinesWidthMenu = glutCreateMenu(ProcessMenu);
glutAddMenuEntry("一般",1);
glutAddMenuEntry("中",2);
glutAddMenuEntry("粗",3);
//颜色
nLinesColorMenu = glutCreateMenu(ProcessMenu);
glutAddMenuEntry("红",4);
glutAddMenuEntry("绿",5);
glutAddMenuEntry("白",6);
glutAddMenuEntry("黄",7);
glutAddMenuEntry("蓝",8);
//填充
nLinesFillInMenu = glutCreateMe