#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
int antialiasing = 0;
int BizierSize = 0;
GLuint selectedPoint = ~0;
int winWidth, winHeight;
GLuint selectBuffer[64];
GLdouble modelMatrix[16], projMatrix[16];
GLint viewport[4];
static bool add_node=false;
static bool del_node=false;
static bool move_node=false;
static int count=0;
GLfloat BC[100][3];
GLfloat *Bizier = &BC[0][0];
void evaluateCurve(void)
{
glEnable(GL_MAP2_VERTEX_3);
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
BizierSize, // number of control points
&BC[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);
}
void drawControlPoints(void)
{
int i; // Counting variable
// Set point size larger to make more visible
glPointSize(5.0f);
// Loop through all control points for this example
for (i = 0; i < BizierSize; i++) {
glLoadName(i);
glBegin(GL_POINTS);
glVertex2fv(&Bizier[i * 3]);
glEnd();
}
}
void selectControlPoints(void)
{
int i;
for (i = 0; i < BizierSize; i++) {
glLoadName(i);
glBegin(GL_POINTS);
glVertex2fv(&Bizier[i * 3]);
glEnd();
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
evaluateCurve();
drawControlPoints();
glutSwapBuffers();
}
void ortho(void)
{
if (winWidth <= winHeight)
glOrtho(-10.0, 10.0, -10.0 * (GLfloat) winHeight / (GLfloat) winWidth,
10.0 * (GLfloat) winHeight / (GLfloat) winWidth, -10.0, 10.0);
else
glOrtho(-10.0 * (GLfloat) winWidth / (GLfloat) winHeight,
10.0 * (GLfloat) winWidth / (GLfloat) winHeight, -10.0, 10.0, -10.0, 10.0);
}
GLuint pick(int x, int y)
{
int hits;
(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(~0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(x, winHeight - y, 16.0, 16.0, viewport);
ortho();
glMatrixMode(GL_MODELVIEW);
selectControlPoints();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits = glRenderMode(GL_RENDER);
if (hits) {
#ifdef DEBUG
{
unsigned int i;
GLint names;
GLuint *ptr;
printf("hits = %d\n", hits);
ptr = (GLuint *) selectBuffer;
for (i = 0; i < hits; i++) { /* for each hit */
int j;
names = *ptr;
printf("number of names for hit = %d\n", *ptr);
ptr++;
printf(" z1 is %g;", (float) *ptr / 0xffffffff);
ptr++;
printf(" z2 is %g\n", (float) *ptr / 0xffffffff);
ptr++;
printf(" the name is ");
for (j = 0; j < names; j++) { /* For each name. */
printf("%d ", *ptr);
ptr++;
}
printf("\n");
}
}
#endif
return selectBuffer[3];
} else
return ~0;
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
winWidth = w;
winHeight = h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
ortho();
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
viewport[0] = 0;
viewport[1] = 0;
viewport[2] = winWidth;
viewport[3] = winHeight;
}
void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN && move_node==true)
selectedPoint = pick(x, y);
else if(state == GLUT_DOWN && del_node==true)
{
selectedPoint = pick(x, y);
for(int i = selectedPoint; i < BizierSize; i++)
{
Bizier[i * 3] = Bizier[i * 3 + 3];
Bizier[i * 3+1] = Bizier[i * 3 + 4];
Bizier[i * 3+2] = Bizier[i * 3 + 5];
}
BizierSize--;
del_node=false;
glutPostRedisplay();
}
else if(state == GLUT_DOWN && add_node==true)
{
GLdouble objx, objy, objz;
gluUnProject(x, winHeight - y, 0,
modelMatrix, projMatrix, viewport,
&objx, &objy, &objz);
BC[BizierSize][0] = objx;
BC[BizierSize][1] = objy;
BC[BizierSize][2] = 0.0;
BizierSize++;
glutPostRedisplay();
}
else
selectedPoint = -1;
}
}
void motion(int x, int y)
{
GLdouble objx, objy, objz;
if (selectedPoint != ~0)
{
gluUnProject(x, winHeight - y, 0,
modelMatrix, projMatrix, viewport,
&objx, &objy, &objz);
BC[selectedPoint][0] = objx;
BC[selectedPoint][1] = objy;
glutPostRedisplay();
}
}
/* ARGSUSED1 */
static void
keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
}
}
enum {
M_ADD_NODE, M_DEL_NODE, MOVE_NODE, M_QUIT
};
void menu(int value)
{
switch (value) {
case M_ADD_NODE:
add_node=true;
del_node=false;
move_node=false;
evaluateCurve();
break;
case M_DEL_NODE:
add_node=false;
del_node=true;
move_node=false;
evaluateCurve();
break;
case MOVE_NODE:
add_node=false;
del_node=false;
move_node=true;
break;
case M_QUIT:
exit(0);
break;
}
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("editgrid");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutMotionFunc(motion);
glutCreateMenu(menu);
glutAddMenuEntry("Add Node", M_ADD_NODE);
glutAddMenuEntry("Del Node", M_DEL_NODE);
glutAddMenuEntry("Move Node", MOVE_NODE);
glutAddMenuEntry("Quit", M_QUIT);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glSelectBuffer(sizeof(selectBuffer), selectBuffer);
// evaluateCurve();
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
BBC.rar_Bernstein_bezier bernstein
版权申诉
168 浏览量
2022-09-20
15:52:51
上传
评论
收藏 10KB RAR 举报
Kinonoyomeo
- 粉丝: 74
- 资源: 1万+
评论0