接着上一篇的 计算实现给出屏幕上任意两个点,求出这两个点之间直线上的所有的点。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的实现了

 /*
date:2014/10/22
version : QuartusII + de1-soc cyclone V
designer : pengxiaoen
funtion : 实现bresenham 算法在象限对直线的计算
|k| <1 任意方向都满足
*/ module bresenham (
clock ,
reset ,
xs_in , //输入的X 点的起始坐标
ys_in , // 输入的Y 点的起始坐标
xe_in , //输入X点的终止坐标
ye_in , //输入Y 点的终止坐标
in_en , //当前输入信号有效标志 1:有效 0:无效 x_ou, //输出的X 点的坐标
y_ou, // 输出的Y 点的坐标
fini_flag //计算完成标志位
);
input clock ,reset ;
input in_en ;
input [:] xs_in ,xe_in ;
input [:] ys_in ,ye_in ; output reg [:] x_ou ;
output reg [:] y_ou ;
output reg fini_flag ; wire [:] dx ; // X方向上的变化量
wire [:] dy ; //Y方向上的变化量
reg signed [:] pi ;
wire x_dir ;
wire y_dir ; wire [:] Xmin ;
wire [:] Xmax ;
wire [:] Ymin ;
wire [:] Ymax ;
//
assign x_dir= (xs_in<xe_in)? 'd0 : 1'd1 ;
assign y_dir= (ys_in<ye_in)? 'd0 : 1'd1 ;
assign Xmin = (xs_in<xe_in)? xs_in : xe_in ;
assign Xmax = (xs_in<xe_in)? xe_in : xs_in ;
assign Ymin = (ys_in<ye_in)? ys_in : ye_in ;
assign Ymax = (ys_in<ye_in)? ye_in : ys_in ; assign dx = Xmax-Xmin; //得出X方向上的差值
assign dy = Ymax-Ymin; //得出Y方向上的差值 reg signed [:] x_cnt ; // X 坐标计数 有符号运算
//**********************************************************
always @ (posedge clock )
if(!reset)
begin
x_cnt <= 'd0 ;
fini_flag <= 'd0 ;
end
else if(in_en) //数据装载
begin
x_cnt <= xs_in ;
fini_flag <= 'd0 ;
end
else if (x_cnt==xe_in) // 运算完毕
begin
//x_cnt <= 10'd0 ;
fini_flag <= 'd1 ;
end
else //运算进行中
begin
x_cnt <= x_cnt + {{{x_dir}},'d1};
fini_flag <= 'd0 ;
end always @(posedge clock )
if(!reset)
begin
y_ou <= 'd0 ;
x_ou <= 'd0 ;
end
else if ((!fini_flag) && (!in_en)) //运算标志正在运算,并且装载数据完成
begin
if(pi[])
begin
pi <= pi+(dy<<) ;
x_ou <= x_cnt ;
end
else
begin
pi <= pi + (dy<<) - (dx<<) ;
y_ou <= y_ou + {{{y_dir}},'d1};
x_ou <= x_cnt ;
end
end
else
begin
pi <= (dy<<)-dx ;
y_ou <= ys_in ;
x_ou <= xs_in ;
end endmodule

附上测试代码

 `timescale 1ns/1ps

 module bresenham_tb ;

 reg clock ,reset ;
reg in_en ;
reg [:] xs_in ,xe_in ;
reg [:] ys_in ,ye_in ; wire [:] x_ou ;
wire [:] y_ou ;
wire fini_flag ; bresenham U1_bresenham(
.clock (clock),
.reset (reset),
.xs_in (xs_in),
.ys_in (ys_in),
.xe_in (xe_in),
.ye_in (ye_in),
.in_en (in_en), .x_ou (x_ou),
.y_ou (y_ou),
.fini_flag (fini_flag)
); always # clock = ~clock ; initial
begin
clock = 'd0 ; reset =1'd0 ; in_en = 'd0 ;
xs_in = 'd0 ; xe_in = 10'd0 ;
ys_in = 'd0 ; ye_in = 9'd0 ; # reset = ;
in_en = ;
xs_in = ; xe_in = ;
ys_in = ; ye_in = ;
# in_en = ;
# ; // k = 1/2 验证 正方向 in_en = ;
xs_in = ; xe_in = ;
ys_in = ; ye_in = ;
# in_en = ;
# ; // k = 1/2 验证 反方向 in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = -1/2 验证 正方向
# in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = -1/2 验证 反方向
# $stop ; end 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. ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes错误4

    今天再测试一个存储过程时,用DBMS_OUTPUT.PUT_LINE输出时,报 ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes SQL ...

  2. 开源流媒体处理库live555服务器端、客户端源代码分析总结

    RTSP服务器端流程: 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话. 首先创 ...

  3. Spring 拦截器实现事物

    Spring+Hibernate的实质:就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactio ...

  4. POJ-1006 Biorhythms

    [题目描述] 三个周期时间分别为:23,28和33.分别给定三个周期的某一天(不一定是第一天),和开始计算的日期,输出下一个triple peak. [思路分析] 如果不了解中国剩余定理,可以通过模拟 ...

  5. Flex4 设置combobox选项不可编辑

    近日做数据的增删改查,使用的flex4的ComboBox控件---> flex4中ComboBox其实就是TextInput的叠加 flex3中ComboBox其实就是Label的叠加 开始是使 ...

  6. QT renered html for js

    voidMainWindow::on_pushButton_clicked() { QStringurl="http://www.baidu.com"; url="htt ...

  7. ExpandableListView(二)替换箭头图标被拉伸的问题

    之前写过一篇替换系统默认图标的文章,之后又发现了问题,当替换成自己的图片之后,图片被拉伸了!为了解决这个问题,我几乎尝试了所有方法,结果都不理想 我试过的方法,在布局里,把textview上的内容字体 ...

  8. Android的重力传感器(3轴加速度传感器)简单实例

    重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...

  9. android程序报错“error launching activity com.android.ddmlib.shellcommandunresponsiveexception”的解决方式

    今天在调试android程序的时候,因为是NDK开发,要先编译.so库再打包下载到android模拟器,所以花费的时间比較长.控制台就会报例如以下错误: error launching activit ...

  10. BZOJ2440(全然平方数)二分+莫比乌斯容斥

    题意:全然平方数是指含有平方数因子的数.求第ki个非全然平方数. 解法:比較明显的二分,getsum(int middle)求1-middle有多少个非全然平方数,然后二分.求1-middle的非全然 ...