C语言使用Bresenham算法生成直线(easyx图形库)

时间:2022-12-04 16:52:52

Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。

其原理是:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。

Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其本质思想也是步进的思想,但由于避免了浮点运算,相当于DDA算法的一种改进算法。

C语言使用Bresenham算法生成直线(easyx图形库)

C语言使用Bresenham算法生成直线(easyx图形库)

C语言使用Bresenham算法生成直线(easyx图形库)

源代码展示:

  1. #include<stdio.h>
  2. #include<graphics.h>
  3. #include<math.h>
  4. #include<conio.h>
  5. #define x0 400 //定义全局变量x0,y0:坐标轴中心(x0,y0)
  6. #define y0 300
  7. void Bresenham(int x1, int y1, int x2, int y2)
  8. {
  9. int x, y, dx, dy, p1, i;
  10. dx = x2 - x1;
  11. dy = y2 - y1;
  12. if (abs(dx) > abs(dy)) //斜率绝对值在(0,1),步进方向为x轴
  13. {
  14. if (x1 < x2) //默认画点从左往右画
  15. {
  16. x = x1;
  17. y = y1;
  18. }
  19. else
  20. {
  21. x = x2;
  22. y = y2;
  23. }
  24. putpixel(x + x0, y0 - y, RED);
  25. Sleep(50);
  26. p1 = 2 * abs(dy) - abs(dx); //计算初始pi的值
  27. for (i = min(x1, x2); i < max(x1, x2); i++)
  28. {
  29. x = x + 1;
  30. if (p1 >= 0)
  31. {
  32. if (dx*dy >= 0)
  33. y = y + 1;
  34. else
  35. y = y - 1; //若Pi>=0,y(i+1)=y(i)±1
  36. p1 = p1 + 2 * (abs(dy) - abs(dx)); //更新pi
  37. }
  38. else
  39. {
  40. y = y; //若Pi<0,y(i+1)=y(i)
  41. p1 = p1 + 2 * abs(dy); //更新pi
  42. }
  43. putpixel(x + x0, y0 - y, RED);
  44. Sleep(50);
  45. }
  46. }
  47. else
  48. {
  49. if (y1 < y2)
  50. { //步进方向为y轴,默认画点从下往上画
  51. x = x1;
  52. y = y1;
  53. }
  54. else
  55. {
  56. x = x2;
  57. y = y2;
  58. }
  59. putpixel(x + x0, y0 - y, RED);
  60. Sleep(50);
  61. p1 = 2 * abs(dx) - abs(dy);
  62. for (i = min(y1, y2); i < max(y1, y2); i++)
  63. {
  64. y = y + 1;
  65. if (p1 >= 0)
  66. {
  67. if (dx*dy >= 0) //判断x方向是增加还是减少,很关键
  68. x = x + 1;
  69. else
  70. x = x - 1;
  71. p1 = p1 + 2 * (abs(dx) - abs(dy));
  72. }
  73. else
  74. {
  75. x = x;
  76. p1 = p1 + 2 * abs(dx);
  77. }
  78. putpixel(x + x0, y0 - y, RED);
  79. Sleep(50);
  80. }
  81. }
  82. }
  83. void main()
  84. {
  85. int x1, x2, y1, y2;
  86. printf("请输入两个整数点的坐标(x1,y1),(x2,y2)\n");
  87. scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  88. initgraph(800, 600); //初始化图形窗口大小
  89. setbkcolor(WHITE);
  90. cleardevice();
  91. setcolor(BLACK);
  92. line(0, y0, x0 * 2, y0); //坐标轴X
  93. line(x0, 0, x0, y0 * 2); //坐标轴Y
  94. Bresenham(x1, y1, x2, y2); //Bresenham画线算法
  95. _getch(); //等待一个任意输入结束
  96. closegraph(); //关闭图形窗口
  97. }

结果显示:

C语言使用Bresenham算法生成直线(easyx图形库)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/l59565455/article/details/87458261