• 直线段扫描算法


    第一个是DDA直线扫描算法,其基本思想是根据直线的点斜式来实现

    第二个是重点画线算法,其基本思想是直线的一般方程ax+by+c=0

    第三个是Bresenham算法

    三个算法的共同特点是都使用了增量的思想

    1. #include
    2. #include
    3. void DDAlien(int x1, int y1, int x2, int y2)
    4. {
    5. int x;
    6. float dx, dy,k,y;
    7. dy = y2 - y1;
    8. dx = x2 - x1;
    9. k = dy / dx;
    10. y = y1;
    11. glBegin(GL_POINTS);
    12. for (x = x1; x <= x2; x++)
    13. {
    14. //drawPixels(x, int(y + 0.5), color);
    15. glColor3i(1, 0, 0);
    16. glVertex2i(x, int(y + 0.5));
    17. y = y + k;
    18. }
    19. glEnd();
    20. }
    21. void MidpointLine(int x1, int y1, int x2, int y2)
    22. {
    23. int a, b, d1, d2, d, x, y;
    24. a = y1 - y2;
    25. b = x2 - x1;
    26. d = 2 * a + b;
    27. d1 = a * 2;
    28. d2 = 2 * (a + b);
    29. x = x1;
    30. y = y1;
    31. glBegin(GL_POINTS); // 开始绘制线段
    32. // 画线
    33. glColor3i(255, 0, 0);
    34. glVertex2i(x, y);
    35. while (x <= x2)
    36. {
    37. if (d < 0)
    38. {
    39. // 画线 (x++,y++)
    40. x++;
    41. y++;
    42. d += d2;
    43. }
    44. else
    45. {
    46. // 画线(x++,y)
    47. x++;
    48. d += d1;
    49. }
    50. // 画线
    51. glColor3i(255, 0, 0);
    52. glVertex2i(x, y);
    53. }
    54. glEnd(); // 结束绘制线段
    55. }
    56. // 用整数代理浮点数运算提高效率
    57. void BresenHamline(int x1, int y1, int x2, int y2)
    58. {
    59. glBegin(GL_POINTS);
    60. int x, y, dx, dy, e;
    61. dx = x2 - x1;
    62. dy = y2 - y1;
    63. e = -dx;
    64. x = x1;
    65. y = y1;
    66. while (x <= x2)
    67. {
    68. glColor3i(255, 0, 0);
    69. glVertex2i(x, y);
    70. x++;
    71. e += 2 * dy;
    72. if (e >= 0)
    73. {
    74. y++;
    75. e = e - 2 * dx;
    76. }
    77. }
    78. glEnd();
    79. }
    80. void myDisplay(void)
    81. {
    82. glClearColor(1.0, 1.0, 1.0, 1.0); // 设置清除颜色为白色
    83. glClear(GL_COLOR_BUFFER_BIT);
    84. //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    85. //DDAlien(0,0,100,100,1);
    86. //MidpointLine(100, 100, 300, 300);
    87. BresenHamline(100, 100, 300, 300);
    88. glFlush();
    89. }
    90. int main(int argc, char* argv[])
    91. {
    92. glutInit(&argc, argv);
    93. glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    94. glutInitWindowPosition(100, 100);
    95. glutInitWindowSize(400, 400);
    96. glutCreateWindow("第一个OpenGL程序");
    97. glutDisplayFunc(&myDisplay);
    98. glMatrixMode(GL_PROJECTION);
    99. glLoadIdentity();
    100. glOrtho(0, 400, 0, 400, -1, 1); // 设置投影矩阵
    101. glMatrixMode(GL_MODELVIEW);
    102. glutMainLoop();
    103. return 0;
    104. }

  • 相关阅读:
    【实现100个unity特效之12】Unity中的冲击波 ——如何使用ShaderGraph制作一个冲击波着色器
    CCF-CSP 30次 第二题【矩阵运算】
    数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
    云原生之k8s】k8s 亲和、反亲和、污点、容忍
    【gzoj3646】Frequent values【RMQ】
    SpringCloud微服务(一)——Consul服务注册中心
    python读取pdf表格并合并为excel
    IDEA 配置git及使用
    mysql9
    sqlite加载csv文件,并做数据分析
  • 原文地址:https://blog.csdn.net/weixin_68798281/article/details/134000256