编程环境:codeblocks+EGE库

用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点。

这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的。

1、中点画线法

只考虑当直线的斜率|k|<1时的情况,假设现在有一条直线(x1,y1,x2,y2),那么第一个点一定是(x1,y1)无疑,下一个点的x坐标为x1+1,y坐标要么为y1要么为y1+。关键在于每次取下一个点时,是取前一个的y1呢,还是y1+1,这时一定是取直线上点最靠近的那个了,而判断取哪个点就用到了中点,我们将中点代入直线中 d=F(x1+1,y1+0.5)=a*(x1+1)+b*(y1+0.5)+c。

(1)如果直线d>=0,则取下边的点也就是(x1+1,y1)。 (2)如果直线d<0,则取上边的点也就是(x1+1,y1+1)。

它的实际过程就是这样每次根据前边的点判断下一个点在哪,然后进行打亮,但这样每次判断的时候都得代入直线方程计算太麻烦了,我们将这俩种情况分别代入直线方程中可以找出规律:

(1)当直线>=0时,经过化解得d1=d+a;

(2)当直线<0时,经过化解得d2=d+a+b;

(3)初始值d0=a+0.5b。

也就是说每次的增量要么为a,要么为a+b,那么这样判断的时候就简单多了,因为我们每次只是判断它的正负。所以给等式同时乘2,将其中浮点数0.5化为整数,这样硬件操作时无疑更快了。

代码:

 1 #include <iostream>
 2 #include <graphics.h>
 3 using namespace std;
 4 //中点画线法
 5 void line1(int x1,int y1,int x2,int y2){
 6
 7      int x,y,d0,d1,d2,a,b;
 8      y=y1;
 9      a=y1-y2;          //直线方程中的a的算法
10      b=x2-x1;          //直线方程中的b的算法
11      d0=2*a+b;         //增量初始值
12      d1=2*a;           //当>=0时的增量
13      d2=2*(a+b);       //当<0时的增量
14      for(x=x1;x<=x2;x++){
15             putpixel(x,y,GREEN);   //打亮
16         if(d0<0){
17             y++;
18             d0+=d2;
19         }else{
20
21         d0+=d1;
22         }
23
24      }
25 }
26 //Bresenham画线算法
27 void line2(int x1,int y1,int x2,int y2){
28
29    int x,y,dx,dy,d;
30    y=y1;
31    dx=x2-x1;
32    dy=y2-y1;
33    d=2*dy-dx;        //增量d的初始值
34    for(x=x1;x<=x2;x++){
35     putpixel(x,y,GREEN);   //打亮
36     if(d<0){
37         d+=2*dy;
38     }else{
39       y++;
40       d+=2*dy-2*dx;
41     }
42
43
44
45    }
46
47 }
48 int main()
49 {
50     initgraph(640,480);       //打开EGE初始化
51     line1(200,160,400,400);   //画线
52     getch();                  //等待用户操作
53     closegraph();             //关闭图形
54     return 0;
55 }

2、Bresenham画线算法

这种画线算法的思想和中点画线的一致,只是在判断取哪个点时,不是看它位于中点的上边还是下边,而是将这俩个点到直线上那个点的距离相减,判断其正负,如果下边的点到直线实际点距离远则的d1-d2>=0那么取上边的点y1+1,同样也是代入直线化解可以得出下面结论:

(1)当d1-d2<0时,d=d+2*dy.

(2)当d1-d2>=0时,d=d+2*dy-2*dx.

(3)d的初始值为  d=2*dy-dx.

其代码如上所示。运行截图如下:

转载于:https://www.cnblogs.com/llsq/p/7506597.html

图形学--(中点画线法+Bresenham画线算法)相关推荐

  1. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  2. 计算机图形学之画圆(中点画圆法、Bresenham画圆法)

    参考学习了一些前辈的代码,总结了以下这个,感谢前人栽树,同时欢迎交流. 整个画圆利用了圆的八对称性,故只需画出八分之一圆就可利用对称性就可以画出整个圆. 专门写了一个函数来画圆的点,其中(x0,y0) ...

  3. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  4. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

  5. openGL实现中点画线算法、DDA画线算法,Bresenham画线算法,并进行鼠标键盘的交互

    首先设置变量用于进行鼠标交互和键盘交互: int m = 0; GLdouble m1 =0, m2 = 0; 1.实验入口主函数: //主函数 int main(int argc, char** a ...

  6. 【计算机图形学】中点画圆算法和Bresenham画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...

  7. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

  8. Bresenham画线算法笔记

    目录 一.DDA算法和中点画线算法的回顾 二.Bresenham画线算法 一.DDA算法和中点画线算法的回顾 1.DDA算法(Digtal Differential Analyzer) 假设两个端点坐 ...

  9. Bresenham画线算法的推导

    转自:https://www.cnblogs.com/soroman/archive/2006/07/27/509602.html 以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日, ...

最新文章

  1. FD32 查询客户信贷管理中,销售值是怎么来的?
  2. Angular 内容投影 content projection 的一个问题的单步调试
  3. js中cookie操作
  4. 使用showMessageDialog显示消息框
  5. 海康相机回调方式理一下
  6. Java 2017.11.20 杨浩宁作业
  7. 123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
  8. 蓝桥杯 连续区间数(抖机灵做法)
  9. echart地图飞线图
  10. 打包小程序公众图标素材6113个菜单栏素材
  11. 设计模式之抽象工厂模式
  12. 苹果usb设置在哪里_努比亚红魔3红魔3S打开开发者选项和USB调试功能
  13. badboy录制网站出现css样式混乱,网页的图标点击没反应
  14. JS创建对象模式7种方法详解
  15. 华盛顿市的布局,也属于风水
  16. 为什么网站服务器不存在了,最可能的原因: 指定的目布医无名录或文件在 Web 服务器上不存在...
  17. 内网代理工具--reGeorg
  18. 用74HC165读8个按键状态
  19. Openstreetmap技术
  20. 如何从官网下载KEIL MDK5软件

热门文章

  1. 跑步健身戴什么耳机合适?五款高性价比运动耳机推荐
  2. 抖音如何推广运营?抖音如何快速涨粉?
  3. 膨胀卷积(空洞卷积)
  4. 送一台高配电脑,吃鸡贼爽!
  5. 达梦数据库(DM8)的安装教程
  6. uniapp简单封装的激励广告和插屏广告
  7. backurl使用,登录后跳转回当前页
  8. 斯坦福21秋季:实用机器学习-李沐课程笔记
  9. 计算机二级MSoffice
  10. @Cacheable注解属性介绍