macOS开发之OpenGL系列文章:

  1. macOS开发之OpenGL Hello World
  2. 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();

图片


四、总结

  1. 指定线宽
    void glLineWidth (GLfloat width)
  2. 开启虚线模式
    glEnable(GL_LINE_STIPPLE);
  3. 敞开虚线模式
    glDisable(GL_LINE_STIPPLE);
  4. 设置直线的点画模式
    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();
    }


图片

  1. 画围棋盘

纵横遍历画19条线,再用点画上九个星就好了:

图片

文中代码分3个文件
lines.c
linego.c 没有上色的棋盘
linego2.c 黑白棋盘

三个代码文件全文见我的github:
https://github.com/coleflower...