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())

 

转载于:https://www.cnblogs.com/paralysis/p/10774992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值