头图

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...image.png


爱写代码的小马
1 声望0 粉丝