接着上一篇的 计算实现给出屏幕上任意两个点,求出这两个点之间直线上的所有的点。http://www.cnblogs.com/sepeng/p/4042464.html 这种直接算法的确是被鄙视了

强大的度娘告诉我们还有专用的算法叫bresenham算法。调用我大脑中所有的数学知识残留借用网上资料,费尽了吃奶的力气才把这个算法推导了一遍,高手们不要笑话

            

            

后来觉得这个时候讨论的是 0<k<1.那么把pi换一换就是 -1<k<0.仿真后发现自己又脑残了一次,对算法知之甚少,组合了好几次都没有组合成功,最后不得不把-1<k<0的算法拿出来讨论

        

这次才知道-1<k<0的时候 pi,xi 长啥样子,我的大脑还是猜不出来的,老老实实的推导算法吧。

算法推导出来了,这下好了就开始写FPGA的实现了

  1. /*
  2. date:2014/10/22
  3. version : QuartusII + de1-soc cyclone V
  4. designer : pengxiaoen
  5. funtion : 实现bresenham 算法在象限对直线的计算
  6. |k| <1 任意方向都满足
  7. */
  8.  
  9. module bresenham (
  10. clock ,
  11. reset ,
  12. xs_in , //输入的X 点的起始坐标
  13. ys_in , // 输入的Y 点的起始坐标
  14. xe_in , //输入X点的终止坐标
  15. ye_in , //输入Y 点的终止坐标
  16. in_en , //当前输入信号有效标志 1:有效 0:无效
  17.  
  18. x_ou, //输出的X 点的坐标
  19. y_ou, // 输出的Y 点的坐标
  20. fini_flag //计算完成标志位
  21. );
  22. input clock ,reset ;
  23. input in_en ;
  24. input [:] xs_in ,xe_in ;
  25. input [:] ys_in ,ye_in ;
  26.  
  27. output reg [:] x_ou ;
  28. output reg [:] y_ou ;
  29. output reg fini_flag ;
  30.  
  31. wire [:] dx ; // X方向上的变化量
  32. wire [:] dy ; //Y方向上的变化量
  33. reg signed [:] pi ;
  34. wire x_dir ;
  35. wire y_dir ;
  36.  
  37. wire [:] Xmin ;
  38. wire [:] Xmax ;
  39. wire [:] Ymin ;
  40. wire [:] Ymax ;
  41. //
  42. assign x_dir= (xs_in<xe_in)? 'd0 : 1'd1 ;
  43. assign y_dir= (ys_in<ye_in)? 'd0 : 1'd1 ;
  44. assign Xmin = (xs_in<xe_in)? xs_in : xe_in ;
  45. assign Xmax = (xs_in<xe_in)? xe_in : xs_in ;
  46. assign Ymin = (ys_in<ye_in)? ys_in : ye_in ;
  47. assign Ymax = (ys_in<ye_in)? ye_in : ys_in ;
  48.  
  49. assign dx = Xmax-Xmin; //得出X方向上的差值
  50. assign dy = Ymax-Ymin; //得出Y方向上的差值
  51.  
  52. reg signed [:] x_cnt ; // X 坐标计数 有符号运算
  53. //**********************************************************
  54. always @ (posedge clock )
  55. if(!reset)
  56. begin
  57. x_cnt <= 'd0 ;
  58. fini_flag <= 'd0 ;
  59. end
  60. else if(in_en) //数据装载
  61. begin
  62. x_cnt <= xs_in ;
  63. fini_flag <= 'd0 ;
  64. end
  65. else if (x_cnt==xe_in) // 运算完毕
  66. begin
  67. //x_cnt <= 10'd0 ;
  68. fini_flag <= 'd1 ;
  69. end
  70. else //运算进行中
  71. begin
  72. x_cnt <= x_cnt + {{{x_dir}},'d1};
  73. fini_flag <= 'd0 ;
  74. end
  75.  
  76. always @(posedge clock )
  77. if(!reset)
  78. begin
  79. y_ou <= 'd0 ;
  80. x_ou <= 'd0 ;
  81. end
  82. else if ((!fini_flag) && (!in_en)) //运算标志正在运算,并且装载数据完成
  83. begin
  84. if(pi[])
  85. begin
  86. pi <= pi+(dy<<) ;
  87. x_ou <= x_cnt ;
  88. end
  89. else
  90. begin
  91. pi <= pi + (dy<<) - (dx<<) ;
  92. y_ou <= y_ou + {{{y_dir}},'d1};
  93. x_ou <= x_cnt ;
  94. end
  95. end
  96. else
  97. begin
  98. pi <= (dy<<)-dx ;
  99. y_ou <= ys_in ;
  100. x_ou <= xs_in ;
  101. end
  102.  
  103. endmodule

附上测试代码

  1. `timescale 1ns/1ps
  2.  
  3. module bresenham_tb ;
  4.  
  5. reg clock ,reset ;
  6. reg in_en ;
  7. reg [:] xs_in ,xe_in ;
  8. reg [:] ys_in ,ye_in ;
  9.  
  10. wire [:] x_ou ;
  11. wire [:] y_ou ;
  12. wire fini_flag ;
  13.  
  14. bresenham U1_bresenham(
  15. .clock (clock),
  16. .reset (reset),
  17. .xs_in (xs_in),
  18. .ys_in (ys_in),
  19. .xe_in (xe_in),
  20. .ye_in (ye_in),
  21. .in_en (in_en),
  22.  
  23. .x_ou (x_ou),
  24. .y_ou (y_ou),
  25. .fini_flag (fini_flag)
  26. );
  27.  
  28. always # clock = ~clock ;
  29.  
  30. initial
  31. begin
  32. clock = 'd0 ; reset =1'd0 ; in_en = 'd0 ;
  33. xs_in = 'd0 ; xe_in = 10'd0 ;
  34. ys_in = 'd0 ; ye_in = 9'd0 ;
  35.  
  36. # reset = ;
  37. in_en = ;
  38. xs_in = ; xe_in = ;
  39. ys_in = ; ye_in = ;
  40. # in_en = ;
  41. # ; // k = 1/2 验证 正方向
  42.  
  43. in_en = ;
  44. xs_in = ; xe_in = ;
  45. ys_in = ; ye_in = ;
  46. # in_en = ;
  47. # ; // k = 1/2 验证 反方向
  48.  
  49. in_en = ;
  50. xs_in = ; xe_in= ;
  51. ys_in = ; ye_in= ;
  52. # in_en = ; // k = -1/2 验证 正方向
  53. #
  54.  
  55. in_en = ;
  56. xs_in = ; xe_in= ;
  57. ys_in = ; ye_in= ;
  58. # in_en = ; // k = -1/2 验证 反方向
  59. #
  60.  
  61. $stop ;
  62.  
  63. end
  64.  
  65. endmodule

bresenham算法的FPGA的实现1的更多相关文章

  1. bresenham算法的FPGA的实现2

    在上一篇里http://www.cnblogs.com/sepeng/p/4045593.html <bresenham算法的FPGA的实现1>已经做了一个整体框架的布局,但是那个程序只是 ...

  2. 《图形学》实验七:中点Bresenham算法画椭圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...

  3. 《图形学》实验六:中点Bresenham算法画圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...

  4. 《图形学》实验五:改进的Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...

  5. 《图形学》实验四:中点Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...

  6. 利用canvas实现的中点Bresenham算法

    Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...

  7. 通过Bresenham算法实现完成矢量线性多边形向栅格数据的转化

    1.实验目的与要求 目的:通过本次实验,完成矢量线性多边形向栅格数据的转化过程: 要求:采用VC++6.0实现. 2.实验方法 采用Bresenham算法实现 3.实验材料 直线的定义:y = x/3 ...

  8. Bresenham算法画填充圆及SDL代码实现

    画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯 ...

  9. 基于Bresenham算法画圆

    bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...

随机推荐

  1. app自动化的webView页面测试思路(appium工具)。

    1.获取当前activity多有的handles,然后去遍历它,发现webView后切换到webView对应模式,就可以了.进一步操作webView的话用下面的方法(driver.getPageSou ...

  2. 菜农群课笔记之ICP与ISP----20110412(整理版)

    耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html        成 ...

  3. Hbuilder 常用快捷键汇总

    朋友推荐用Hbuilder编辑器,看了下Hbuilder官网和那视频,感觉牛逼哄哄的, 自己也就体验了一下,打开Hbuilder的快捷键列表,每个快捷键都体验了一下,以下展示出来的,每一个都是精华,每 ...

  4. ThinkPHP 3.1.2 视图-1

    一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件 [index].html(.tpl) 更换模板文 ...

  5. How many prime numbers(求素数个数)

    How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. MySQL的字段设计

    1.尽量使用数字,因为文本占空间,不利于查询(针对有限种类文本)

  7. 特殊集合(stack、queue、hashtable的示例及练习)

    特殊集合:stack,queue,hashtable stack:先进后出,一个一个的赋值一个一个的取值,按照顺序. .count           取集合内元素的个数 .push()        ...

  8. Xcode 新版本如何设置ARC

    在刚刚开始学习IOS开发时,最好不要开启ARC,这样有助于学习内存管理,但不少刚刚接触Xcode的朋友可能会发现,当你使用最新版本的Xcode时,敲入release等代码时会提示报错.这是因为系统默认 ...

  9. BZOJ 1225: [HNOI2001] 求正整数( dfs + 高精度 )

    15 < log250000 < 16, 所以不会选超过16个质数, 然后暴力去跑dfs, 高精度计算最后答案.. ------------------------------------ ...

  10. linkbutton.js

    jquery.linkbutton.js /** * linkbutton - jQuery EasyUI * * Licensed under the GPL: * http://www.gnu.o ...