macOS开发之OpenGL系列文章:
这篇文章学习和探索与画线相关的API,跟线相关的绘制模式有三个
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
一、GL_LINES
其中 GL_LINES 最为简单,依次两两连接 glBegin 和 glEnd 中的顶点,比如
glBegin(GL_LINES);
glVertex2f(0.1f, 0.1f);
glVertex2f(0.8f, 0.8f);
glVertex2f(0.3f, 0.5f); // 不足两个点丢弃
glEnd();
除了实线,我们还可以画虚线
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0x4e73a); // 0xD903 0x0F0F
glLineWidth(4.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
glEnd();
glDisable(GL_LINE_STIPPLE);
其中控制是否虚线,主要由开关GL_LINE_STIPPLE,以及glLineStipple来控制。
void glLineStipple(GLint factor, GLushort pattern);
pattern 是由1 和 0组成的长度为16 的序列,从最低位开始看,如果为1,则直线上接下来应该画的 factor 个点将被画为实的;如果为0,则直线上接下来应该画的 factor 个点将被画为虚的。
二、GL_LINE_STRIP
GL_LINE_STRIP 会依次连接所有顶点 1->2->3->4 如此连接
glBegin(GL_LINE_STRIP);
glVertex2f(0.5f, 1.0f);
glVertex2f(0.8f, 0.3f);
glVertex2f(0.1f, -0.9f);
glVertex2f(-0.3f, 1.0f);
glEnd();
如上代码的效果图如下:
图片
三、GL_LINE_LOOP
GL_LINE_LOOP是画封闭线段,它会以1->2->3->4->1的模式连接所有顶点
glBegin(GL_LINE_LOOP);
glVertex2f(0.3f, 0.4f);
glVertex2f(0.8f, 0.3f);
glVertex2f(0.89f, 0.2f);
glVertex2f(0.1f, -0.8f);
glEnd();
图片
四、总结
- 指定线宽
void glLineWidth (GLfloat width) - 开启虚线模式
glEnable(GL_LINE_STIPPLE); - 关闭虚线模式
glDisable(GL_LINE_STIPPLE); 设置直线的点画模式
void glLineStipple (GLint factor, GLushort pattern);
五、拓展绕中点按角度旋转画直线
/**- 顺时针旋转画直线
- math.h中三角函数的参数是弧度,不是角度
- 绕点旋转算法
- x' = (x-a)cosα+(y-b)sinα+a
- y' = -(x-a)sinα+(y-b)cosα+b
- @param maxAngle 最大角度
- @param gap 每次旋转角度
*/
void paintLines2(int maxAngle, int gap)
{
glLineWidth(2.0f);
glBegin(GL_LINES);float x2 = 0; float y2 = 0; float startX = -1; float startY = 0; float endX = 1; float endY = 0; for (int i = 0; i <= maxAngle; i=i+gap) { float xa = (startX - x2) * cos(i*PI/180) + (startY - y2) * sin(i*PI/180) + x2; float ya = (startX - x2) * sin(i*PI/180) + (startY - y2) * cos(i*PI/180) + y2; float xb = (endX - x2) * cos(i*PI/180) + (endY - y2) * sin(i*PI/180) + x2; float yb = (endX - x2) * sin(i*PI/180) + (endY - y2) * cos(i*PI/180) + y2; glVertex2f(xa, ya); glVertex2f(xb, yb); }
glEnd();
}
图片
- 画围棋盘
纵横遍历画19条线,再用点画上九个星就好了:
图片
文中代码分3个文件
lines.c
linego.c 没有上色的棋盘
linego2.c 彩色棋盘
三个代码文件全文见我的github:
https://github.com/coleflower...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。