《计算机图形学常用算法及代码大全》由会员分享,可在线阅读,更多相关《计算机图形学常用算法及代码大全(41页珍藏版)》请在人人文库网上搜索。

1、2.1.1 生成直线的DDA算法数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。一、直线DDA算法描述:设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得= m =直线的斜率(21)可通过计算由x方向的增量x引起y的改变来生成直线:xi+1=xi+x(22)yi+1=yi+y=yi+xm(23)也可通过计算由y方向的增量y引起x的改变来生成直线:yi+1=yi+y(24)xi+1=xi+x=xi+y/m(25)式(22)至(25)是递推的。二、直线DDA算法思想:选定x2x1和y2y1。

2、中较大者作为步进方向(假设x2x1较大),取该方向上的增量为一个象素单位(x=1),然后利用式(21)计算另一个方向的增量(y=xm=m)。通过递推公式(22)至(25),把每次计算出的(xi+1,yi+1)经取整后送到显示器输出,则得到扫描转换后的直线。之所以取x2x1和y2y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。另外,算法实现中还应注意直线的生成方向,以决定x及y是取正值还是负值。三、直线DDA算法实现:1、已知直线的两端点坐标:(x1,y1),(x2,y2)2、已知画线的颜色:color3、计算两个方向的变化量:dx=x2x1dy=y2y14、求出两个。

3、方向最大变化量的绝对值:steps=max(|dx|,|dy|)5、计算两个方向的增量(考虑了生成方向):xin=dx/stepsyin=dy/steps6、设置初始象素坐标:x=x1,y=y17、用循环实现直线的绘制:for(i=1;i0)?static_cast(fNum+0.5):static_cast(fNum-0.5)/*!* brief DDA画线函数* param pDC in窗口DC* param BeginPt in直线起点* param EndPt in直线终点* param LineCor in直线颜色* return 无*/void CDrawMsg:DDA_DrawL。

4、ine(CDC *pDC,CPoint &BeginPt,CPoint &EndPt,COLORREF LineCor)long YDis = (EndPt.y - BeginPt.y);long XDis = (EndPt.x-BeginPt.x);long MaxStep = max(abs(XDis),abs(YDis); / 步进的步数float fXUnitLen = 1.0f; / X方向的单位步进float fYUnitLen = 1.0f; / Y方向的单位步进fYUnitLen = static_cast(YDis)/static_cast(MaxStep);fXUnitLe。

5、n = static_cast(XDis)/static_cast(MaxStep);/ 设置起点像素颜色pDC-SetPixel(BeginPt.x,BeginPt.y,LineCor); float x = static_cast(BeginPt.x);float y = static_cast(BeginPt.y);/ 循环步进for (long i = 1;iSetPixel(FloatToInteger(x),FloatToInteger(y),LineCor);2.1.2 生成直线的Bresenham算法从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的。

6、生成速度较慢。在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。一、直线Bresenham算法描述:它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个象素。我们首先讨论m=y/x,当0m1且x1d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。(2)当此值为负时,d10,因此pi与(d1-d2)有相同的符号;这里y=y2-y1,m=y/x;c=2y+x(2b-1)。下面对式(2-11)作进一步处理,以便。

7、得出误差判别递推公式并消除常数c。将式(2-11)中的下标i改写成i+1,得到:pi+1=2yxi+1-2xyi+1+c(212)将式(2-12)减去(2-11),并利用xi+1=xi+1,可得:pi+1= pi+2y-2x(yi+1-yi)(213)再假设直线的初始端点恰好是其象素点的坐标,即满足:y1=mx1+b(214)由式(2-11)和式(2-14)得到p1的初始值: p1=2y-x(215)这样,我们可利用误差判别变量,得到如下算法表示:初始 p1=2y-x(216)当pi0时: yi+1=yi+1,xi+1=xi+1,pi+1=pi+2(y-x)否则:yi+1=yi,xi+1=xi。

8、+1, pi+1=pi+2y从式(2-16)可以看出,第i+1步的判别变量pi+1仅与第i步的判别变量pi、直线的两个端点坐标分量差x和y有关,运算中只含有整数相加和乘2运算,而乘2可利用算术左移一位来完成,因此这个算法速度快并易于硬件实现。三、直线Bresenham算法思想之二:由于象素坐标的整数性,数学点(xi,yi)与所取象素点(xi,yir)间会引起误差(i),当xi列上已用象素坐标(xi,yir)表示直线上的点(xi,yi),下一直线点B(xi+1,yi+1),是取象素点C(xi+1,yir ),还是D(xi1,y(i+1)r)呢?设A为CD边的中点,正确的选择:若B点在A点上方,选。

9、择D点; 否则,选C点。用误差式描述为:(xi+1)=BC-AC=(yi+1-yir)-0.5(28)求递推公式:(xi+2)=(yi+2-y(i+1)r)-0.5 = yi+1+m-y(i+1)r-0.5(29)当(xi+1)0时,选D点,y(i+1)r = yir+1(xi+2)= yi+1+m-yir-1-0.5=(xi+1)+m-1(210)当(xi+1)0时,选C点,y(i+1)r = yir(xi+2)= yi+1+myir-0.5=(xi+1)+m(211)初始时:(xs+1)=BC-AC=m-0.5(212)为了运算中不含实型数,同时不影响不等式的判断,将方程两边同乘一正整数。。

10、令方程两边同乘2x,即d=2x,则:初始时:d = 2y-x(213)递推式:当d0时: d=d+2(yx);y+;x+;否则: d=d+2y;x+; (214)实现代码void Bresenhamline (int x0,int y0,int x1, int y1,int color)int x, y, dx, dy;float k, e;dx = x1-x0, dy = y1- y0, k=dy/dx;e=-0.5, x=x0, y=y0;for (i=0; i=0) y+, e=e-1;或者将e扩大2dx倍;void Bresenhamline (int x0,int y0,int x1。

11、, int y1,int color)int x, y, dx, dy;float k, e;dx = x1-x0, dy = y1- y0, k=dy/dx;e=-dx, x=x0, y=y0;for (i=0; i=0) y+, e=e-2dx;四、直线Bresenham算法实现:条件:0m1且x1=0) y=y+1;p=p+2(y-x);else p=p+2y;五、直线Bresenham算法完善:现在我们修正(2-16)公式,以适应对任何方向及任何斜率线段的绘制。如下图所示,线段的方向可分为八种,从原点出发射向八个区。由线段按图中所示的区域位置可决定xi+1和yi+1的变换规律。容易证明。

12、:当线段处于、区时,以|x|和|y|代替前面公式中的x和y,当线段处于、区时,将公式中的|x|和|y|对换,则上述两公式仍有效。在线段起点区分线段方向七、直线Bresenham算法特点:由于程序中不含实型数运算,因此速度快、效率高,是一种有效的画线算法。2.2.2 中点算法生成圆中点画圆算法在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定。实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。一、中点画圆算法描述设要显示圆的圆心在原点(0,0),半径为R,起点在(0,R)处,终点在(,)处,顺时针生成八分之一圆,利用对称性扫描转换全部圆。为了应用中点画圆。

13、法,我们定义一个圆函数F(x,y)=x2+y2-R2(219)任何点(x,y)的相对位置可由圆函数的符号来检测:F(x,y)0点(x,y)位于数学圆外(220)如下图所示,图中有两条圆弧A和B,假定当前取点为Pi(xi,yi),如果顺时针生成圆,那么下一点只能取正右方的点E(xi+1,yi)或右下方的点SE(xi+1,yi-1)两者之一。中点画线算法假设M是E和SE的中点,即 ,则:1、当F(M)0时,M在圆外(圆弧B),表明SE点离圆更近,应取SE点;3、当F(M)=0时,在E点与SE点之中随便取一个即可,我们约定取SE点。 二、中点画圆算法思想因此,我们用中点M的圆函数作为决策变量di,同。

14、时用增量法来迭代计算下一个中点M的决策变量di+1。(221)下面分两种情况来讨论在迭代计算中决策变量di+1的推导。1、见图(a),若di0;当点(x,y)在圆上时,则F(x,y)=0;二、正负画圆算法思想现以下图的AB弧为例,来说明正负画圆法(顺时针生成圆)。假设当前点为Pi(xi,yi),取下一个点Pi+1(xi+1,yi+1)的原则是: 1、当F(xi,yi)0时:取xi+1= xi+1,yi+1= yi。即向右走一步,从圆内走向圆外。对应图(a)中的从Pi到Pi+1。2、当F(xi,yi)0时:取xi+1= xi,yi+1= yi-1。即向下走一步,从圆外走向圆内。对应图(b)中的从。

15、Pi到Pi+1。由于向圆内或向圆外走取决于F(xi,yi)的正负,因此称为正负法。下面分两种情况求出F(xi,yi)的递推公式:(1) 当F(xi,yi)0时,向右走,取xi+1=xi+1,yi+1=yi,则F(xi+1,yi+1)=F(xi+1,yi)=(xi+1)2+yi2-R2=(xi2+yi2-R2)+2xi+1= F(xi,yi)+2xi+1(2-28)(2) 当F(xi,yi)0时,向下走,取xi+1=xi,yi+1=yi-1,则F(xi+1,yi+1)=F(xi,yi-1)=xi2+(yi-1)2-R2=(xi2+yi2-R2)-2yi+1= F(xi,yi)-2yi+1(2-9。

16、)初始时,x=0,y=R,故 F(0,R)=(02+R2)-R2=0 (2-30)公式(2-28)、(2-29)和(2-30)就构成正负画圆算法的核心。给象素坐标(x,y)及F赋初始值后,进入循环画点;画点后,根据F的符号进行F值的递推和下一个点的获取,直到xy为止。同前面介绍的一样,利用圆的八分对称性,循环一次,画八个点。三、正负画圆算法实现注意:初值不同、圆的生成方向不同时,当前点和下一个点的获取原则是不同的,见下图。例如,初始点(R,0),逆时针生成圆,从图(b)可知:若当前点Pi在圆内,则下一点Pi+1(xi,yi+1),即向上走一步;若当前点Pi在圆外,则下一点Pi+1(xi-1,y。

17、i),即向左走一步;(a) 顺时针生成圆 (b) 逆时针生成圆五、正负画圆算法特点物理意义清楚,程序中只含整数运算,因此算法速度快。六、正负画圆算法程序/ 顺时针生成圆void PNARC(int x0,int y0,int r,int color)int x=0,y=r,f=0;while(xymax) /*(xmin,ymin)和(xmax,ymax)为窗口左下角、右上角坐标。*/*c=*c|0x08; else if(yxmax)*c=*c|0x02;else if(x0时,线段从裁剪边界延长线的内部延伸到外部;例如,当x0时,对于左边界p10(p2=x),线段从右边界的内部到外部。当y。

18、0(p3=-y),线段从下边界的内部到外部;对于上边界p40),对这些边界计算rk=qk/pk,u2取0和各个r值之中的最小值。3、如果u1u2,则线段完全落在裁剪窗口之外,应当被舍弃;否则,被裁剪线段的端点可以由u1和u2计算出来。二、梁友栋-Barsky裁剪算法实现:1、初始化线段交点的参数:u1=0,u2=1;2、计算出各个裁剪边界的p、q值;3、调用函数clipTest(),在函数中根据p、q来判断:是舍弃线段还是改变交点的参数。(1) 当p0时,参数r用于更新u2。(u2=minu2,rk)(3)如果更新了u1或u2后,使u1u2,则舍弃该线段。(4)当p=0且q0时,因为线段平行于边界并且位于边界之外,则舍弃该线段。见下图所示。4、p、q的四个值经判断后,如果该线。

计算机图形学常见算法原理,计算机图形学常用算法及代码大全相关推荐

  1. 计算机主板的工作原理,计算机主板的工作原理.doc

    计算机主板的工作原理 计算机主板构造和工作原理 主板通常拥有多种不同的内置功能,并且可以直接影响计算机的功能和升级潜力.在本文中,我们将了解一下主板的通用部件.随后,我们将仔细研究显著影响计算机性能的 ...

  2. 算法设计之五大常用算法设计方法总结

    算法设计之五大常用算法设计方法总结 一.[分治法] 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再 ...

  3. 计算机组成原理与系统结构原理,计算机组成原理与系统结构

    <计算机组成原理与系统结构>由会员分享,可在线阅读,更多相关<计算机组成原理与系统结构(25页珍藏版)>请在人人文库网上搜索. 1.计算机组成原理与系统结构,教学重点:计算机的 ...

  4. etc的常见算法_几个常用算法的适应场景及其优缺点(非常好)

    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验. ...

  5. 如何用计算机计算三位数彩票,Excel彩票常用的统计分析函数大全(网上搜集的)...

    楼主 Excel彩票常用的统计分析函数大全(网上搜集的) 1.ABS:求出参数的绝对值. 2.AND:"与"运算,返回逻辑值,仅当有参数的结果均为逻辑"真(TRUE)&q ...

  6. mysql区间算法_「五大常用算法」一文图解分治算法和思想

    前言 分治算法(divide and conquer)是五大常用算法(分治算法.动态规划算法.贪心算法.回溯法.分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算 ...

  7. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  8. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

    本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法.分享给大家供大家参考,具体如下: 完整实例代码如下: A*寻路算法 #stage { border: 1px solid lig ...

  9. 十.激光SLAM框架学习之LeGO-LOAM框架---算法原理和改进、项目工程代码

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

最新文章

  1. Python小程序:你看?这千年难遇的雪景—简直“美到犯规” 【满屏雪花飞舞 】
  2. 省掉1/3的回归测试:Facebook用机器学习自动选择测试策略
  3. Linux下使用ping出现destination is unreachable的问题可能性
  4. 使用C#的HttpWebRequest模拟登陆网站(续)
  5. 并发编程(原子性、可见性、一致性)
  6. uboot——之初体验
  7. python输入成绩求总分和平均分_python脚本如何输入成绩求平均分?
  8. 我的世界服务器传送系统,我的世界多人服务器任何人都没权限了 不能回主城 不能传送 等等...
  9. 云服务器搭建Hadoop集群
  10. R语言--异常值检测
  11. Mixpanel使用注意点
  12. 海康摄像头忘记密码,自己如何快速重置密码
  13. 希捷为 Xbox 更新 Game Drive SSD 具有新外观和内部结构
  14. zzuli1728(数学期望,组合数)
  15. 基于JAVA计算机类专业考研交流学习平台计算机毕业设计源码+数据库+lw文档+系统+部署
  16. bootstrap采样技术和Jackknife采样技术的思想
  17. 安装centos7.0时电脑进入黑屏的解决方法
  18. python预测股票价格tushare_Python:tushare获取A股指数数据,使用LSTM进行预测,pythontushare,并...
  19. 【竞赛复盘】2022雪浪算力开发者大赛——阀体异常检测
  20. NFSTAT寄存器 的RnB的bit4

热门文章

  1. 根据URL链接分析获取中图分类号
  2. 富士施乐248b粉盒清零_打印机DocuPrintM228B如何清零
  3. fieldset lengend 的应用
  4. Codeforces镜像站( Codeforces.live)
  5. 完全用Linux工作,抛弃window/王垠
  6. 《小学生四则运算出题软件》结对项目总结
  7. NOIp2016 联赛总结——新手上路请多关照
  8. 云计算实战:Amazon EC2之初体验
  9. MEM/MBA数学强化(05)应用题
  10. Windows 11家庭版