OpenGL根據極坐標參數方程繪制心形線、螺旋線等圖形


本代碼參考自《計算機圖形學》第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())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM