Bresenham算法的特点是:
2,不用浮点数,只用整数;
3,只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现
Bresenham算法速度很快,并适于用硬件实现
DDA算法的特点:
浮点数运算
不易硬件实现
中点画线法特点:
只有整数运算,不含乘除法
可用硬件实现
因(X0,Y0)在直线上,所以F(X0,Y0)=0
画线需要调用消息相应函数,鼠标按下时定义原点,鼠标d起时定义终点。重绘需要调用onpaint。updatedata(true/flase),其中true是将获取到的数据传递到变量里面,false是将变量里面的数据传递出来。一般情况下true和false是配套使用。在传递前调用updatedata(true),最后调用updatedata(false)将数据更新。
直线扫描算法主要包含三种算法,DDA算法、中点画线算法、Bresenham直线算法。
这三种算法都要事先要确定两个端点(起点和终点),从起点开始每次走一步,每走一步画一个点,直至到达终点。
这个前提也比较好理解,因为如果朝斜率大的方向走,可能没走几步就走完了,那画出来的直线就是离散的。
以下我们只讨论朝x方向移动的情况。(y方向的情况是一样的)
DDA算法实际上是根据 斜截式直线方程 来画的。
但这么做实际上是比较消耗性能的,因为斜截式方程, 它涉及到了乘法运算 。因此我们需要通过 增量思想 对它进行优化。
这样转换后,我们就可以根据当前的位置来找到下一步的位置,且每次计算只需要进行一次 浮点的加法运算 ,一次四舍五入取整即可。
中点画线算法实际上是根据 一般式直线方程 来画的。它是通过判断中点在直线的下方还是上方,来决定下一步的坐标位置。
但这样也是非常消耗性能的,把中点带入F(x, y)中,会涉及到2个乘法,4个加法。我们依然可以通过增量的方式来对它进行优化。
这样我们就优化到每次只需要一次 整数加法 即可,且还不需要四舍五入。因此它要更优于DDA算法。
Breseham算法是通过比较d(交点与交点下方最近的点的距离)来进行选择的。d每次按照k的大小增加。
但这么做依旧和DDA算法一样,会涉及到浮点数k的加法。我们可以通过 换元的方式 对它进行下优化。
这样就能使得每次进行一次或两次的 整数加法运算 ,不需要四舍五入。效率高于DDA,低于中点画线算法。
但Bresenham算法不依赖直线方程,使得它能有更宽泛的适用范围。
你调用SetPixel是你自己的函数还是打算调用Windows API?
如果调用Windows API,要包含windowsh
另外Windows API SetPixel有四个参数,第一个参数是DC的句柄。后面三个如你这样子。
而且控制台程序也没有DC句柄,要选Win32工程,不过Win32工程的入口不是main而是WinMain。
首先给定两个点(x1,y1)(x2,y2)
那么可以算出斜率:k=(y2-y1)/(x2-x1)
直线公式:y = k(x-x1) + y1
先假设斜率小于1。
从(x1,y1)开始,使用画点函数在该处画点。
然后将x1自增1,计算y的值。调用画点函数画点,位置是(x1+1,k+y1),然后再把x1自增1,计算y的值……循环下去,直到x1已经自增到了与x2同样大小。
当然在实际 *** 作时,我们不应改变x1,x2,y1,y2的值,而是应该另设变量初始化为这四个量,然后改变这几个变量的值。
如果斜率小于1,就把方程中y和x的位置互换,改为每次y1自增1,计算x的取值……
若斜率等于1,y=x,最容易了……
但是,当直线非常长时,误差就比较大了,建议使用Bresenham算法……详见《计算机图形学》。
以上就是关于求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.全部的内容,包括:求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.、MFC对话框按下按钮没效果怎么解决(按键处理程序应该写什么)、直线扫描算法(个人总结,仅供参考)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)