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

发布时间:2020-10-12 20:13:20 作者:MMagicLoren
来源:脚本之家 阅读:155

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

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

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

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

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

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

源代码展示:

#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<conio.h>
#define x0 400    //定义全局变量x0,y0:坐标轴中心(x0,y0)
#define y0 300           
void Bresenham(int x1, int y1, int x2, int y2) 
{
 int x, y, dx, dy, p1, i;
 dx = x2 - x1;            
 dy = y2 - y1;
 if (abs(dx) > abs(dy)) //斜率绝对值在(0,1),步进方向为x轴
 {       
 if (x1 < x2)   //默认画点从左往右画
 {         
  x = x1;
  y = y1;
 }
 else
 {
  x = x2;
  y = y2;
 }    
 putpixel(x + x0, y0 - y, RED);
 Sleep(50);
 p1 = 2 * abs(dy) - abs(dx);     //计算初始pi的值
 for (i = min(x1, x2); i < max(x1, x2); i++) 
 {
  x = x + 1;
  if (p1 >= 0) 
  {
  if (dx*dy >= 0)
   y = y + 1;
  else
   y = y - 1;  //若Pi>=0,y(i+1)=y(i)±1
  p1 = p1 + 2 * (abs(dy) - abs(dx));  //更新pi
  }
  else 
  {
  y = y;     //若Pi<0,y(i+1)=y(i)
  p1 = p1 + 2 * abs(dy);   //更新pi
  }
  putpixel(x + x0, y0 - y, RED);
  Sleep(50);
 }
 }
 else 
 {
 if (y1 < y2) 
 {       //步进方向为y轴,默认画点从下往上画     
  x = x1;
  y = y1;
 }
 else 
 {
  x = x2;
  y = y2;
 }
 putpixel(x + x0, y0 - y, RED);
 Sleep(50);
 p1 = 2 * abs(dx) - abs(dy);
 for (i = min(y1, y2); i < max(y1, y2); i++) 
 {
  y = y + 1;
  if (p1 >= 0) 
  {
  if (dx*dy >= 0)   //判断x方向是增加还是减少,很关键
   x = x + 1;
  else
   x = x - 1;
  p1 = p1 + 2 * (abs(dx) - abs(dy));
  }
  else 
  {
  x = x;
  p1 = p1 + 2 * abs(dx);
  }
  putpixel(x + x0, y0 - y, RED);
  Sleep(50);
 }
 }
}
void main() 
{
 int x1, x2, y1, y2;
 printf("请输入两个整数点的坐标(x1,y1),(x2,y2)\n");
 scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
 initgraph(800, 600);  //初始化图形窗口大小
 setbkcolor(WHITE);
 cleardevice();
 setcolor(BLACK);
 line(0, y0, x0 * 2, y0); //坐标轴X
 line(x0, 0, x0, y0 * 2); //坐标轴Y
 Bresenham(x1, y1, x2, y2);      //Bresenham画线算法
 _getch();     //等待一个任意输入结束
 closegraph();     //关闭图形窗口
}

结果显示:

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

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

推荐阅读:
  1. RPG手游中Bresenham算法推导以及应用
  2. C++实现基于EASYX库扫描线算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言 bresenham 直线

上一篇:Mysql| 使用通配符进行模糊查询详解(like,%,_)

下一篇:Java编程使用卡片布局管理器示例【基于swing组件】

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》