本代碼參考自《計算機圖形學》第4版,根據極坐標參數方程繪制曲線:蝸形線、心形線、三葉曲線、四葉曲線、螺旋線共5種圖形。
生成定點坐標的程序如下所示,該函數將需要繪制的頂點按順序添加到入參verts的最后
typedef enum { LIMACON = 1,
CARDIOID,
THREELEAF,
FOURLEAF,
SPIRAL } curveName;
void GLApp::genVertices(std::vector<glm::vec2> &verts, GLint curveNum, const GLint x0, const GLint y0) { const GLdouble twoPi = 6.283185; const GLint a = 175, b = 60; GLfloat r, theta, dtheta = 1.0 / float(a); glm::vec2 curvePt[2]; curvePt[0].x = x0; curvePt[0].y = y0; switch (curveNum) { case LIMACON: curvePt[0].x += a + b; break; case CARDIOID: curvePt[0].x += a + a; break; case THREELEAF: curvePt[0].x += a; break; case FOURLEAF: curvePt[0].x += a; break; case SPIRAL: break; default: break; } theta = dtheta; while (theta < twoPi) { switch (curveNum) { case LIMACON: r = a * cos(theta) + b; break; case CARDIOID: r = a * (1 + cos(theta)); break; case THREELEAF: r = a * cos(3 * theta); break; case FOURLEAF: r = a * cos(2 * theta); break; case SPIRAL: r = (a / 4.0) * theta; break; default: break; } curvePt[1].x = x0 + r * cos(theta); curvePt[1].y = y0 + r * sin(theta); verts.push_back(curvePt[0]); verts.push_back(curvePt[1]); curvePt[0].x = curvePt[1].x; curvePt[0].y = curvePt[1].y; theta += dtheta; } }
繪制時調用glDrawArrays(GL_LINES, 0, vert_num);
(vert_num等於verts.size())