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

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

《计算机图形学常用算法及代码大全》由会员分享,可在线阅读,更多相关《计算机图形学常用算法及代码大全(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

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签