计算机图形学常见算法原理,计算机图形学常用算法及代码大全-程序员宅基地

技术标签: 计算机图形学常见算法原理  

《计算机图形学常用算法及代码大全》由会员分享,可在线阅读,更多相关《计算机图形学常用算法及代码大全(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的四个值经判断后,如果该线。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36274181/article/details/118987745

智能推荐

CSS flex布局的使用之逆战班系列_nzjustify无效-程序员宅基地

文章浏览阅读102次。一、 什么是flex布局Flex是Flexible Box的缩写,也称“弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。注:设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。二、 基本概念采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为F..._nzjustify无效

SpringBoot 疫苗接种管理系统--83448 (免费领源码、附论文)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案-程序员宅基地

文章浏览阅读70次。本次系统设计中,以用户的实际操作感作为整体开发的出发点,结合Java开发语言对软件开发原理,本次软件的开发以实际运用作为出发点,以改善疫苗接种管理效率为目的,使用SpingBoot框架技术整体开发源程序,最终实现一个改善疫苗接种管理系统。在整体的开发过程中,首先了解用户的需要,分析现状及问题点,参考成熟的类似系统,不断改进,最终实现系统的设计开发。

软件工程专业毕业设计 - 毕设选题推荐合集-程序员宅基地

文章浏览阅读1.3k次,点赞24次,收藏15次。软件工程专业毕业设计选题合集涵盖了管理系统、小程序、深度学习、机器学习、算法、人工智能、大数据、网络安全、嵌入式、推荐系统、目标检测等多个热门领域。对于计算机专业、软件工程专业、人工智能专业、通信工程专业的毕业生而言,选择一个合适的毕业设计选题至关重要。在这个毕业设计选题合集中,我们精心收集了各种有趣且具有挑战性的选题,旨在帮助学生们在毕业设计中展现他们的技术实力和创新能力。不论是对于对深度学习技术感兴趣的同学,还是希望探索机器学习、算法或人工智能的领域的同学,本合集都能为您提供丰富的选题资源和灵感。

Ac-PEG-AA不仅具有良好的反应活性,还具有良好的水溶性-程序员宅基地

文章浏览阅读309次,点赞3次,收藏4次。Ac-PEG-AA是由丙烯酸(AA)和聚乙二醇(PEG)通过酯化反应连接而成的。这种连接使得Ac-PEG-AA既具有PEG的特性,又具有丙烯酸的反应性。Ac-PEG-AA的乙酰基部分具有很好的反应性,能够与多种化学基团发生反应,从而实现与其他分子或材料的连接。丙烯酸部分则提供了可反应的羧基,可以与氨基、羟基等基团发生酯化或酰胺化反应,从而将Ac-PEG-AA与其他分子结合。规格标准:1g,5g,10g,可提供mg级以及kg级的产品开发服务。分子量:1k,2k,3.4k,5k,10k,20k(可按需定制)

HTML5 桌面通知:Notification API_html5 获取系统通知-程序员宅基地

文章浏览阅读630次。前言Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息。该通知是脱离浏览器的,即使用户没有停留在当前标签页,甚至最小化了浏览器,该通知信息也一样会置顶显示出来。用户权限想要向用户显示通知消息,需要获取用户权限,而相同的域名只需要获取一次权限。只有用户允许的权限下,Notification 才能起到作用,避免某些网站的广告滥用 Notific_html5 获取系统通知

python求线性回归斜率-程序员宅基地

文章浏览阅读3.1k次。一、 先说我对这个题目的理解直线的x,y方程是这样的:y = kx+b, k就是斜率.求线性回归斜率, 就是说 有这么一组(x, y)的对应值——样本。如果有四组,就说样本量是4.根据这些样本,做“线性回归”,最终求出一条直线(即y = kx + b的k值和b值),使得样本里的各个点(x, y) “尽可能的”落到直线(或者直线附近)上。二、 python解题需要安装的包实际解题主要用到的pytho..._计算函数型线性回归模型的斜率

随便推点

html中的img标签你不知道的那些细节!_img tag-程序员宅基地

文章浏览阅读1.2k次。设置<img>标签加载失败时的默认图片案例1,img标签的src可以去请求后台的资源,比如,可以去请求后台的Servletimg标签的src可以去请求后台的Servlet,如下图:其他案例,img标签的onerror事件源代码如下:imgTag.html页面<!DOCTYPE html><html><head><meta charset="UTF-8">&l..._img tag

线性回归知识点_线性回归方程知识点-程序员宅基地

文章浏览阅读1w次。目录线性回归的目标函数梯度下降求解目标函数线性回归的目标函数在将训练样本的 x 逐个带入后,得出的预测值 y’ = a + bx 与真实年薪 y 整体的差异最小。 一个样本的 y 和 y’ 的差异用 (y′−y)2来表示。整体差距呢叫做 Cost Function在(a,b) 中,x(i)和 y(i)是常量参数(也就是 m 个样本各自的 x 和 y 值),而 a 和 b 成..._线性回归方程知识点

Linux防火墙管理_linux中的防火墙管理-程序员宅基地

文章浏览阅读1k次。接下来,我们演示关闭防火墙:(如果是非超级用户的操作,会要求我们输入当前系统用户的密码)Centos7下默认的防火墙是 Firewall。查看防火墙状态:(已经dead了!说明防火墙没有安装,需要安装。_linux中的防火墙管理

Unity Mesh实现图片切割(一)- 线与顶点_unity图形切片polygon-程序员宅基地

文章浏览阅读1.9k次。Unity Mesh实现图片切割(一)一、 PolygonCollider2D获取顶点和线段PolygonCollider2D中有points属性,对应和图形的顶点,PolygonCollider2D的顶点可以手动添加或者删除,右键Element X可选择删除这个点。由于Unity中所有图片都是连个三角面组成的矩形,在此需要手动拖动点勾勒出图片的有效切割范围。points属性的点顺序如图逆..._unity图形切片polygon

net_adm:names() 能得到所有的节点名-程序员宅基地

文章浏览阅读120次。Simon 10:07:42 有个命令,能得到所有的节点名,是什么? Android郎哲10:08:06 nodes() 熊心飞扬 10:08:09 nodes() Simon 10:08:35 不是,是得到本机器的所有节点名 Simon 10:08:43 什么names Android郎哲10:09:12 是得到本机器的所有节点名? Si..._:net_adm.names

如何利用空号检测 API 降低企业的业务成本_判断电话号码是否为空 api-程序员宅基地

文章浏览阅读364次。空号检测 API 是一种基于云计算的人工智能技术,它可以通过大数据算法、机器学习等技术对电话号码进行分析和处理,识别出有效和无效号码。_判断电话号码是否为空 api