//用u方向生成的44个点,再对v方向继续进行迭代 GLfloat pv12[100][100][3]; GLfloat pv22[100][100][3]; GLfloat pv32[100][100][3]; for (int g = 0; g < 11; g++) { GLint h = 0; for (double t = 0.00; t <= 1.00; t += 0.10) { pv12[h][g][0] = (1 - t) * pu31[0][g][0] + t * pu31[1][g][0]; pv12[h][g][1] = (1 - t) * pu31[0][g][1] + t * pu31[1][g][1]; pv12[h][g][2] = (1 - t) * pu31[0][g][2] + t * pu31[1][g][2]; pv12[h + 11][g][0] = (1 - t) * pu31[1][g][0] + t * pu31[2][g][0]; pv12[h + 11][g][1] = (1 - t) * pu31[1][g][1] + t * pu31[2][g][1]; pv12[h + 11][g][2] = (1 - t) * pu31[1][g][2] + t * pu31[2][g][2]; pv12[h + 22][g][0] = (1 - t) * pu31[2][g][0] + t * pu31[3][g][0]; pv12[h + 22][g][1] = (1 - t) * pu31[2][g][1] + t * pu31[3][g][1]; pv12[h + 22][g][2] = (1 - t) * pu31[2][g][2] + t * pu31[3][g][2]; pv22[h][g][0] = (1 - t) * pv12[h][g][0] + t * pv12[h + 11][g][0]; pv22[h][g][1] = (1 - t) * pv12[h][g][1] + t * pv12[h + 11][g][1]; pv22[h][g][2] = (1 - t) * pv12[h][g][2] + t * pv12[h + 11][g][2]; pv22[h + 11][g][0] = (1 - t) * pv12[h + 11][g][0] + t * pv12[h + 22][g][0]; pv22[h + 11][g][1] = (1 - t) * pv12[h + 11][g][1] + t * pv12[h + 22][g][1]; pv22[h + 11][g][2] = (1 - t) * pv12[h + 11][g][2] + t * pv12[h + 22][g][2]; pv32[g][h][0] = (1 - t) * pv22[h][g][0] + t * pv22[h + 11][g][0]; pv32[g][h][1] = (1 - t) * pv22[h][g][1] + t * pv22[h + 11][g][1]; pv32[g][h][2] = (1 - t) * pv22[h][g][2] + t * pv22[h + 11][g][2]; h = h + 1; } }
时间: 2023-06-27 20:02:01 浏览: 66
这段代码是使用双三次样条插值算法将一个 u 方向上的 4 个点,生成 44 个点后,在 v 方向上进行迭代,最终生成 100x100 个点的三维坐标数组 pv32。其中,u 方向上的 4 个点存储在 pu31 数组中,v 方向上的插值结果分别存储在 pv12、pv22 和 pv32 数组中。具体实现过程是在 u 方向上进行插值,生成 pv12 数组;然后在 pv12 数组的基础上在 u 方向上进行插值,生成 pv22 数组;最后在 pv22 数组的基础上在 u 方向上进行插值,生成 pv32 数组。
相关问题
优化这段代码//用u方向生成的44个点,再对v方向继续进行迭代 GLfloat pv12[100][100][3]; GLfloat pv22[100][100][3]; GLfloat pv32[100][100][3]; for (int g = 0; g < 11; g++) { GLint h = 0; for (double t = 0.00; t <= 1.00; t += 0.10) { pv12[h][g][0] = (1 - t) * pu31[0][g][0] + t * pu31[1][g][0]; pv12[h][g][1] = (1 - t) * pu31[0][g][1] + t * pu31[1][g][1]; pv12[h][g][2] = (1 - t) * pu31[0][g][2] + t * pu31[1][g][2]; pv12[h + 11][g][0] = (1 - t) * pu31[1][g][0] + t * pu31[2][g][0]; pv12[h + 11][g][1] = (1 - t) * pu31[1][g][1] + t * pu31[2][g][1]; pv12[h + 11][g][2] = (1 - t) * pu31[1][g][2] + t * pu31[2][g][2]; pv12[h + 22][g][0] = (1 - t) * pu31[2][g][0] + t * pu31[3][g][0]; pv12[h + 22][g][1] = (1 - t) * pu31[2][g][1] + t * pu31[3][g][1]; pv12[h + 22][g][2] = (1 - t) * pu31[2][g][2] + t * pu31[3][g][2]; pv22[h][g][0] = (1 - t) * pv12[h][g][0] + t * pv12[h + 11][g][0]; pv22[h][g][1] = (1 - t) * pv12[h][g][1] + t * pv12[h + 11][g][1]; pv22[h][g][2] = (1 - t) * pv12[h][g][2] + t * pv12[h + 11][g][2]; pv22[h + 11][g][0] = (1 - t) * pv12[h + 11][g][0] + t * pv12[h + 22][g][0]; pv22[h + 11][g][1] = (1 - t) * pv12[h + 11][g][1] + t * pv12[h + 22][g][1]; pv22[h + 11][g][2] = (1 - t) * pv12[h + 11][g][2] + t * pv12[h + 22][g][2]; pv32[g][h][0] = (1 - t) * pv22[h][g][0] + t * pv22[h + 11][g][0]; pv32[g][h][1] = (1 - t) * pv22[h][g][1] + t * pv22[h + 11][g][1]; pv32[g][h][2] = (1 - t) * pv22[h][g][2] + t * pv22[h + 11][g][2]; h = h + 1; } }
可以考虑使用循环和数组来简化代码和提高效率。以下是一个可能的优化版本:
```
const int NUM_POINTS = 44;
const int NUM_ITERATIONS = 10;
GLfloat pv12[NUM_POINTS][NUM_POINTS][3];
GLfloat pv22[NUM_POINTS][NUM_POINTS][3];
GLfloat pv32[NUM_POINTS][NUM_POINTS][3];
for (int g = 0; g < NUM_POINTS; g++) {
for (int h = 0; h < NUM_POINTS; h++) {
GLfloat t = (GLfloat)h / (NUM_POINTS - 1);
pv12[h][g][0] = (1 - t) * pu31[0][g][0] + t * pu31[1][g][0];
pv12[h][g][1] = (1 - t) * pu31[0][g][1] + t * pu31[1][g][1];
pv12[h][g][2] = (1 - t) * pu31[0][g][2] + t * pu31[1][g][2];
t = (GLfloat)h / (NUM_POINTS - 1) + 0.1;
pv12[h + 11][g][0] = (1 - t) * pu31[1][g][0] + t * pu31[2][g][0];
pv12[h + 11][g][1] = (1 - t) * pu31[1][g][1] + t * pu31[2][g][1];
pv12[h + 11][g][2] = (1 - t) * pu31[1][g][2] + t * pu31[2][g][2];
t = (GLfloat)h / (NUM_POINTS - 1) + 0.2;
pv12[h + 22][g][0] = (1 - t) * pu31[2][g][0] + t * pu31[3][g][0];
pv12[h + 22][g][1] = (1 - t) * pu31[2][g][1] + t * pu31[3][g][1];
pv12[h + 22][g][2] = (1 - t) * pu31[2][g][2] + t * pu31[3][g][2];
}
}
for (int g = 0; g < NUM_POINTS; g++) {
for (int h = 0; h < NUM_POINTS; h++) {
GLfloat t = (GLfloat)h / (NUM_POINTS - 1);
pv22[h][g][0] = (1 - t) * pv12[h][g][0] + t * pv12[h + 11][g][0];
pv22[h][g][1] = (1 - t) * pv12[h][g][1] + t * pv12[h + 11][g][1];
pv22[h][g][2] = (1 - t) * pv12[h][g][2] + t * pv12[h + 11][g][2];
t = (GLfloat)h / (NUM_POINTS - 1) + 0.1;
pv22[h + 11][g][0] = (1 - t) * pv12[h + 11][g][0] + t * pv12[h + 22][g][0];
pv22[h + 11][g][1] = (1 - t) * pv12[h + 11][g][1] + t * pv12[h + 22][g][1];
pv22[h + 11][g][2] = (1 - t) * pv12[h + 11][g][2] + t * pv12[h + 22][g][2];
}
}
for (int g = 0; g < NUM_POINTS; g++) {
for (int h = 0; h < NUM_POINTS; h++) {
GLfloat t = (GLfloat)h / (NUM_POINTS - 1);
pv32[g][h][0] = (1 - t) * pv22[h][g][0] + t * pv22[h + 11][g][0];
pv32[g][h][1] = (1 - t) * pv22[h][g][1] + t * pv22[h + 11][g][1];
pv32[g][h][2] = (1 - t) * pv22[h][g][2] + t * pv22[h + 11][g][2];
}
}
```
在这个版本中,我们使用了循环来迭代所有的点,并且在每个迭代中使用一个变量`t`来计算每个点的位置。我们还使用了常量来定义数组的大小,使代码更具可读性和可维护性。最后,我们减少了重复代码的使用,提高了代码的效率和可读性。
//By:ZHangFY #include <GL/glut.h> GLfloat rotate_angle1 = 0.0; GLfloat dSize = 0.3; //立方体大小 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(rotate_angle1, -0.3, 0.3, -0.3);//旋转点 glBegin(GL_QUADS); //上 glColor3f(0.0, 1.0, 0.0); //绿 glNormal3d(0.0, 0.0, 1.0); //上 glVertex3d(dSize, dSize, dSize); glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, -dSize, dSize); glVertex3d(dSize, -dSize, dSize); //下 glColor3f(0.0, 0.0, 1.0); //蓝 glNormal3d(0.0, 0.0, -1.0);//下 glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(dSize, -dSize, -dSize); //前 glColor3f(1.0, 0.0, 0.0); //红 glNormal3d(1.0, 0.0, 0.0);//前 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(dSize, dSize, -dSize); //后 glColor3f(0.0, 1.0, 1.0); //青 glNormal3d(-1.0, 0.0, 0.0);//后 glVertex3d(-dSize, dSize, dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //左 glColor3f(1.0, 0.0, 1.0); //品红 glNormal3d(0.0, -1.0, 0.0);//左 glVertex3d(dSize, -dSize, dSize); glVertex3d(dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, -dSize); glVertex3d(-dSize, -dSize, dSize); //右 glColor3f(1.0, 1.0, 0.0); //黄 glNormal3d(0.0, 1.0, 0.0);//右 glVertex3d(dSize, dSize, dSize); glVertex3d(dSize, dSize, -dSize); glVertex3d(-dSize, dSize, -dSize); glVertex3d(-dSize, dSize, dSize); rotate_angle1 += 3; glEnd(); glFlush(); glutSwapBuffers(); } void myIdle(void) { myDisplay(); //Sleep(20); //减慢旋转速度 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("立方体旋转MODEL"); glutDisplayFunc(&myDisplay); glutIdleFunc(&myIdle); glutMainLoop(); return 0; }
这段代码使用 OpenGL 绘制了一个可以旋转的立方体。其中,glRotatef() 函数用于旋转立方体,glBegin() 和 glEnd() 函数用于开始和结束绘制图形的过程,glVertex3d() 函数用于指定顶点坐标,glColor3f() 函数用于指定颜色,glNormal3d() 函数用于指定法向量。myIdle() 函数用于控制旋转速度。你可以编译运行这段代码,看看绘制的立方体是如何旋转的。
阅读全文