求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.

求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较.,第1张

Bresenham算法的特点是:

1,不必计算直线斜率,因此不做除法;

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对话框按下按钮没效果怎么解决(按键处理程序应该写什么)、直线扫描算法(个人总结,仅供参考)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10117960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存