共计 1920 个字符,预计需要花费 5 分钟才能阅读完成。
macOS 开发之 OpenGL 系列文章:
- macOS 开发之 OpenGL Hello World
- 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…