GLfloat initX = 0, initY = 0; GLfloat oldx = 0, oldy = 0; int times = 0; bool gDrawline = false; void drawkoch(GLfloat dir, GLfloat len, GLint iter) { GLdouble dirRad = dir * 3.1415926 / 180.f; GLfloat newX = oldx + len * cos(dirRad); GLfloat newY = oldy + len * sin(dirRad); if (iter == 0) { glVertex2f(oldx, oldy); glVertex2f(newX, newY); oldx = newX; oldy = newY; } else { iter--; len = len / 3; drawkoch(dir, len, iter); dir += 60; drawkoch(dir, len, iter); dir -= 120; drawkoch(dir, len, iter); dir += 60; drawkoch(dir, len, iter); } } typedef GLfloat point2d[2]; int iter = 0; float snowAngle = 0; point2d p = { 960, 20 }; point2d anyline[2]; point2d pp; void CMFCGLSetupView::OnDraw(CDC* pDC) { CMFCGLSetupDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: add draw code for native data here wglMakeCurrent(pDC->m_hDC, m_hRC); oldx = initX; oldy = initY; glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, Cx, 0, Cy, -1000, 1000); switch (drawMode) { case 0: glTranslatef(400, 450, 0); glBegin(GL_LINES); glColor3f(0.0, 1.0, 0.0); drawkoch(0, 500, iter); glEnd(); break; case 1: glTranslatef(400, 450, 0); glPushMatrix(); glTranslated(250, -125 * sqrt(3), 0); glRotated(snowAngle, 0, 1, 0); glTranslated(-250, 125 * sqrt(3), 0); glBegin(GL_LINES); glColor3f(0.0, 1.0, 0.0); drawkoch(0, 500, iter); drawkoch(-120, 500, iter); drawkoch(-240, 500, iter); glEnd(); glPopMatrix(); break; case 2: if (gDrawline) { oldx = anyline[0][0]; oldy = anyline[0][1]; point2d v; v[0] = (anyline[1][0] - anyline[0][0]); v[1] = (anyline[1][1] - anyline[0][1]); float len = sqrt(v[0] * v[0] + v[1] * v[1]); v[0] /= len; v[1] /= len; point2d n = { 1, 0 }; float cosTheta = v[0] * n[0] + v[1] * n[1]; float angle = acos(cosTheta) * 180.f / PI; if (anyline[1][1] < anyline[0][1]) { angle = -angle; } glBegin(GL_LINES); drawkoch(angle, len, iter); glEnd(); } break; default: break; } glBegin(GL_POINTS); glVertex2f(pp[0], pp[1]); glEnd(); glFlush(); wglMakeCurrent(pDC->m_hDC, NULL); }
时间: 2024-04-03 22:35:59 浏览: 67
这段代码是使用OpenGL库绘制Koch曲线的实现。具体来说,这段代码定义了一个名为`drawkoch`的函数,该函数使用递归的方式绘制Koch曲线。在`OnDraw`函数中,根据不同的`drawMode`变量值,选择不同的绘制模式来绘制Koch曲线:
- 当`drawMode`为0时,绘制一个普通的Koch曲线;
- 当`drawMode`为1时,绘制一个Koch雪花;
- 当`drawMode`为2时,绘制用户自定义的线段。
其中,绘制Koch曲线和Koch雪花的实现方式相同,都是调用`drawkoch`函数来进行递归绘制。而绘制用户自定义线段的方式则需要先计算出线段的长度和方向,然后调用`drawkoch`函数来进行绘制。
此外,代码中还定义了一些全局变量,如`initX`、`initY`、`oldx`、`oldy`等,用于记录绘制Koch曲线时的初始点和当前绘制点的坐标。还有一些辅助函数,如计算角度和距离的函数等。
相关问题
利用OpenGL生成起点(0,0), 终点(5,2)的直线(6个点)
在OpenGL中,绘制直线通常不是通过逐点描点的方式,而是通过顶点数组或者线形渲染(DrawArrays 或 DrawElements)。对于起点(0, 0)和终点(5, 2)的简单直线,我们可以考虑使用顶点缓冲对象(Vertex Buffer Object, VBO)和基本顶点数组对象(Vertex Array Object, VAO)来简化绘制过程。
首先,我们需要创建两个顶点,每个顶点包含三个信息:位置(x, y)以及颜色或其他属性。在这个例子中,我们只关心位置:
```cpp
GLfloat vertices[] = {
// 起点 (0, 0)
0.0f, 0.0f, // x, y
1.0f, 0.0f, // 红色(假设颜色为红色)
// 终点 (5, 2)
5.0f, 2.0f,
1.0f, 1.0f, // 绿色(假设颜色为绿色)
};
```
接着,设置顶点缓冲和顶点数组:
```cpp
GLuint vbo; // VBO ID
GLuint vao; // VAO ID
// 初始化VBO
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 创建VAO
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 绑定VBO并指定数据布局
glEnableVertexAttribArray(0); // 假设我们的顶点只有位置属性
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); // 位置,浮点型,不归一化,无纹理坐标
// 渲染直线
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glDrawArrays(GL_LINES, 0, 2); // 绘制两段线,因为有两个顶点
```
最后记得在`main`结束前释放资源:
```cpp
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
glutDestroyWindow(window);
exit(EXIT_SUCCESS);
```
如果我的glm::mat4 matrix[0][1]=2,那我传到gles中的矩阵H,那H[0][1]是否是2,还是H[1][0]=2
在OpenGL ES中,矩阵的默认布局是按列主序(column-major)的。而在glm库中,`glm::mat4`对象的索引操作是按照行列顺序进行的。
因此,如果你将`glm::mat4`对象的元素`matrix[0][1]`设置为2,那么在将它传递给OpenGL ES时,对应的矩阵元素应该是`H[1][0]`。
具体来说,你需要将`glm::mat4`对象转换为一个按列主序存储的数组,并将这个数组传递给OpenGL ES的uniform变量。下面是一个示例代码片段:
```cpp
glm::mat4 matrix = glm::mat4(1.0f);
matrix[0][1] = 2;
GLfloat matrixArray[16];
memcpy(matrixArray, glm::value_ptr(matrix), sizeof(GLfloat) * 16);
glUniformMatrix4fv(matrixLocation, 1, GL_FALSE, matrixArray);
```
在这个示例中,`matrixLocation`是你在GLSL着色器中矩阵uniform变量的位置。`glm::value_ptr`函数用于获取`glm::mat4`对象的指针。然后,通过使用`memcpy`函数将矩阵数据复制到一个按列主序存储的数组中,最后将这个数组传递给`glUniformMatrix4fv`函数。
这样,在GLSL着色器中,你可以通过访问`H[1][0]`来获取对应的值。
阅读全文