乐趣区

关于macos:macOS开发之OpenGL画线及点线画围棋盘

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…

退出移动版