dda直线算法vs2017[dda画线算法] |
您所在的位置:网站首页 › dda算法和bresenham算法 › dda直线算法vs2017[dda画线算法] |
本文目录一览: 1、计算机图形学:直线段扫描转换算法 2、如何简单理解DDA算法 3、直线的生成算法有哪些 4、VC++怎么实现用户给出两点,用DDA算法连成线段? 5、dda法生成直线的基本原理是什么?为什么说Bersenham画圆的算法效率较高? 6、直线扫描算法(个人总结,仅供参考) 计算机图形学:直线段扫描转换算法//数值微分算法(DDA算法) #includeiostream using namespace std; int main() { float x0,y0,x1,y1,x2,y2; cinx1y1; cinx0y0; float k; k=(y1-y0)/(x1-x0); if(k1) { x2=x1+1; y2=y2+k; } else if(k=1) { y2=y1+1; x2=1/k+x1; } coutx2" "y2endl; return 0; } //中点划线算法 #includeiostream using namespace std; int main() { float x,y; float x0,y0,x1,y1; cinx0y0x1y1; float a,b,c; a=y0-y1; b=x1-x0; c=x0*y1-x1*y0; float sum; sum=a*x+b*y+c; float Xq,Yq; float Xm,Ym; Xm=x0+1; Ym=y0+0.5; float d; d=a*Xm+b*Ym+c; if(d0) {Xq=x0+1; Yq=y0+1; } else if(d0) { Xq=x0+1; Yq=y0; } else if(d=0) { Xq=x0+1; Yq=y0; } coutXq" "Yqendl;return 0; } //Bresenham算法//有一个整数数组,请求出两两之差绝对值最大的值(最小的值) #includeiostream using namespace std; int jisuan(int a,int b) { int des=0; des=a-b; if(des0) des=-des; return des;} int main() { int dec=0; int max=0; int a[5]={0,2,5,9,4}; for(int i=1;i5;i++) { dec=jisuan(a[i],a[i-1]); if(maxdec) max=dec; } coutmaxendl; return 0; } 不好意思,最后一个是我写的另一个代码,贴错了 如何简单理解DDA算法DDA称为数值微分画线算法。 是直线生成算法中最简单的一种.原理相当简单,就是最直观的根据斜率的偏移程度,决定是以x为步进方向还是以y为步进方向.然后在相应的步进方向上,步进变量每次增加一个像素,而另一个相关坐标变量则为Yk_1=Yk+m(以x为步进变量为例,m为斜率)。 直线的生成算法有哪些第一种算法:DDA直线生成算法是一种使用微分方程生成直线的算法,又称作数值微分法。该算法的基本思想是:根据斜率确定增量最大的方向,每次迭代时均在该方向上走一步,然后根据直线方程计算出另一方向上的值,对其四舍五入后得到像素坐标。第二种算法:Bresenham直线生成算法与DDA算法类似,每次迭代时均在增量最大方向上走一步,并计算决策参数,根据决策参数确定像素坐标。算法的巧妙之处在于采用了增量计算,使得对于每一列,只要检查误差量的符号,就可以确定该下一列的像素坐标。 VC++怎么实现用户给出两点,用DDA算法连成线段?在你的CXXXview类上右键 添加成员函数类型void 函数名DDALine(参数是两个点的xy坐标 还有颜色值RGB 一共五个参数) 再次鼠标右键CXXXView添加成员变量 参数两个点的坐标 四个参数 都是float 公有成员public 如果直接在窗体里根据已知参数话直线的话 把你的代码放在OnDraw()函数里 如果用鼠标操作的话 那你要添加windows消息 按快捷键ctrl+w 类向导找到你的CXXXView在消息里添加WM_OnLButtonDown(鼠标按下) WM_OnMouseMove(鼠标移动) WM_OnButtonUp(鼠标抬起) 并设置一个BOOL变量控制画线 在OnLButtonDown里传递参数point.x point.y等于初始点xy坐标 bool量=true OnMouseMove里的point是第二坐标的xy OnButtonUp bool量等于false [img]dda法生成直线的基本原理是什么?为什么说Bersenham画圆的算法效率较高?DDA算法主要是根据直线公式y = kx + b来推导出来的,其关键之处在于如何设定单位步进,即一个方向的步进为单位步进,另一个方向的步进必然是小于1。算法的具体思路如下: 1. 输入直线的起点、终点; 2. 计算x方向的间距:△X和y方向的间距:△Y。 3. 确定单位步进,取MaxSteps = max(△X,△Y); 若△X=△Y,则X方向的步进为单位步进,X方向步进一个单位,Y方向步进△Y/MaxSteps;否则相反。 4. 设置第一个点的像素值 5. 令循环初始值为1,循环次数为MaxSteps,定义变量x,y,执行以下计算: a. x增加一个单位步进,y增加一个单位步进 b. 设置位置为(x,y)的像素值 Bresenham算法是DDA算法画线算法的一种改进算法。本质上它也是采取了步进的思想。不过它比DDA算法作了优化,避免了步进时浮点数运算,同时为选取符合直线方程的点提供了一个好思路。首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|k|1时,在x方向进行单位步进;当斜率k的绝对值|k|1时,在y方向进行单位步进。 1. 输入线段的起点和终点。 2. 判断线段的斜率是否存在(即起点和终点的x坐标是否相同),若相同,即斜率不存在, 只需计算y方向的单位步进(△Y+1次),x方向的坐标保持不变即可绘制直线。 3. 计算线段的斜率k,分为下面几种情况处理 a. k等于0,即线段平行于x轴,即程序只需计算x方向的单位步进,y方向的值不变 b. |k|等于1,即线段的x方向的单位步进和y方向的单位步进一样,皆为1。直接循环△X次计算x和y坐标。 4. 根据输入的起点和终点的x、y坐标值的大小决定x方向和y方向的单位步进是1还是-1 6. 画出第一个点。 7. 若|k| 1,设m =0,计算P0,如果Pm0,下一个要绘制的点为(Xm+单位步进,Ym), Pm+1 = Pm -2*△Y; 否则要绘制的点为(Xm+单位步进,Ym+单位步进) Pm+1 = Pm+2*△X-2*△Y; 8. 重复执行第七步△X-1次; 9. 若|k| 1,设m =0,计算Q0,如果Qm0,下一个要绘制的点为(Xm,Ym+单位步进), Pm+1 = Pm -2*△X; 否则要绘制的点为(Xm+单位步进,Ym+单位步进) Pm+1 = Pm+2*△Y-2*△X; 10. 重复执行第9步△Y-1次; 直线扫描算法(个人总结,仅供参考)直线扫描算法主要包含三种算法,DDA算法、中点画线算法、Bresenham直线算法。 这三种算法都要事先要确定两个端点(起点和终点),从起点开始每次走一步,每走一步画一个点,直至到达终点。 这个前提也比较好理解,因为如果朝斜率大的方向走,可能没走几步就走完了,那画出来的直线就是离散的。 以下我们只讨论朝x方向移动的情况。(y方向的情况是一样的) DDA算法实际上是根据 斜截式直线方程 来画的。 但这么做实际上是比较消耗性能的,因为斜截式方程, 它涉及到了乘法运算 。因此我们需要通过 增量思想 对它进行优化。 这样转换后,我们就可以根据当前的位置来找到下一步的位置,且每次计算只需要进行一次 浮点的加法运算 ,一次四舍五入取整即可。 中点画线算法实际上是根据 一般式直线方程 来画的。它是通过判断中点在直线的下方还是上方,来决定下一步的坐标位置。 但这样也是非常消耗性能的,把中点带入F(x, y)中,会涉及到2个乘法,4个加法。我们依然可以通过增量的方式来对它进行优化。 这样我们就优化到每次只需要一次 整数加法 即可,且还不需要四舍五入。因此它要更优于DDA算法。 Breseham算法是通过比较d(交点与交点下方最近的点的距离)来进行选择的。d每次按照k的大小增加。 但这么做依旧和DDA算法一样,会涉及到浮点数k的加法。我们可以通过 换元的方式 对它进行下优化。 这样就能使得每次进行一次或两次的 整数加法运算 ,不需要四舍五入。效率高于DDA,低于中点画线算法。 但Bresenham算法不依赖直线方程,使得它能有更宽泛的适用范围。 标签: dda直线算法vs2017 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |