直线、圆、椭圆的生成算法

合集下载

第3章 光栅图形生成算法

第3章 光栅图形生成算法

颜色(亮度)
监视器

CRT控制器
同步信号
《图形学与虚拟环境》
郑州大学信息工程学院
赵新灿
2
3.1 3.2 3.3 3.4 3.5 3.6
直线生成算法 圆生成算法 椭圆生成算法 区域填充算法 字符的生成 反走样技术
《图形学与虚拟环境》
郑州大学信息工程学院
赵新灿
3
3.1 直线生成算法
直线是最基本的图元,曲线由一系列直 线段逼近,复杂图形可看作是由无数直线 段组成的。直线生成质量影响计算机图形 设计的质量。因此,光栅化直线生成算法 必须服从四条原则:直而光滑、端点准确、 亮度均匀、速度快。 生成算法: 逐点比较法、数值微分法、 中点画线法、Bresenham画线算法等。
then steps=abs(x2-x1); /**|k|=<1 **/
else steps=abs(y2-y1); /** |k|>1 **/ dx=(x2-x1)/(float)steps; dy=(y2-y1)/(float)steps; for(i=0;i<steps;i++)
{drawpixel ( int(x+0.5sign(x)),
T Q S M M
S(xi+1,yi)
di≥0,取正右方像素(xi+1=xi+1,yi+1=yi);若再求下一 个直线上的点,得判别式增量形式: di+1=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c=di+a (3-5) 式中,d增量为a
《图形学与虚拟环境》 郑州大学信息工程学院 赵新灿 15

计算机图形学第3章 基本图形生成算法

计算机图形学第3章 基本图形生成算法
基函数(基本样条) 在局部参数区域分布 (支撑区间),因此 影响范围有限。
例题:有点P0(4,3);P1(6,5);P2(10,
6 );P3(12,4),用以上4点构造2次B样条曲线。
2.1.7 非均匀有理B样条
非均匀有理B样条NURBS(Non Uniform Rational BSpline);
3.2.2
Bresenham画圆法
该算法是最有效的算法之一。
不失一般性,假设圆心(xc,yc) ,圆上的点(x′,y′),则:
x' x xc
y ' y yc
圆心为原点,半径为R的位于第一象限1/8圆弧的画法,即(0, R)~( R , R )。
2 2
yi ), 思想:每一步都选择一个距离理想圆周最近的点P( xi , 使其误差项最小。
画其他曲线。
3.3
自由曲线的生成
正弦函数曲线
指数函数曲线
多项式函数曲线
自 由 曲 线
概率分布曲线及样条函数曲线
3.3.1 曲线的基本理论
基本概念
2.1.4
规则曲线:可用数学方程式表示出来的,如抛物 线等。
自由曲线:很难用一个数学方程式描述的,如高
速公路等。可通过曲线拟合(插值、逼近)的方法来
例题: 利用Bresenham算法生成P (0,0)到Q(6,5)的直 线所经过的像素点。要求先 列出计算式算出各点的坐标 值,然后在方格中标出各点。
(1,1)
3.1.5 双步画线法 原理
模式1:当右像素位于右下角时,中间像素位于底线 模式4:当右边像素位右上角时,中间像素位于中线 模式2和模式3:当右像素位于中线时,中间像素可能位于底线 上,也可能位于中线上,分别对应于模式2和模式3,需进一步 判断。 当0≤k≤1/2时,模式4不可能出现,当1/2≤k≤1时,模式1不 可能出现。

计算机图形学课件第2讲:直线及圆生成算法

计算机图形学课件第2讲:直线及圆生成算法

di 0 di 0
xi1 xi 1
22
中点画线算法
例:利用中点画线算法绘制一条直线:两端点分别为P0(0,0) 、P1(5,2)。
解:首先计算斜率k=0.4 ,因为斜率k小于1,故适用推导。
a=y0-y1=-2 , b=x1-x0=5 , d0=b=5 d1=2a=-4 , d2=2(a+b)=6
M
15
中点画线算法
令M为P1和P2的中点,易知M的坐标为 (xp+1,yp+0.5)。设Q是理想直线与垂直线x=xp+1的 交点。显然,若M在Q的下方,则P2离直线近,应 取为下一个像素;否则应P1 。
16
中点画线算法
问题:判断距离理想直线最近的下一个像素点
已知:线段两端点(x0,y0),(x1,y1) 直线方程:F(x,y)=ax+by+c=0
直线及圆生成算法
光栅图形学
Display processor
Frame buffer
Video Controller
Monitor
2
光栅图形学
0 1 2 ... 0 1 2 . . .
y
x 3
光栅图形学
4
二维图形的显示
是指完成图元的参数表示形式到点阵表示形式的 转换。通常也称扫描转换图元(Scan Conversion)
setPixel( x, y ); error = error + dy; if (error >= 0) { ++y; error = error - dx ; } }
33
斜率的问题
当斜率k>1, DDA, Bresenham算法:
34

直线和圆弧的生成算法

直线和圆弧的生成算法

第3章直线和圆弧的生成算法3.1直线图形的生成算法数学上的直线是没有宽度、由无数个点构成的集合,显然,光栅显示器只能近地似显示直线。

当我们对直线进展光栅化时,需要在显示器有限个像素中,确定最优逼近该直线的一组像素,并且按扫描线顺序,对这些像素进展写操作,这个过程称为用显示器绘制直线或直线的扫描转换。

由于在一个图形中,可能包含成千上万条直线,所以要求绘制算法应尽可能地快。

本节我们介绍一个像素宽直线绘制的三个常用算法:数值微分法〔DDA〕、中点画线法和Bresenham算法。

3.1.1逐点比拟法3.1.2数值微分(DDA)法设过端点P0(x0,y0)、P1(x1,y1)的直线段为L(P0,P1),如此直线段L的斜率L的起点P0的横坐标x0向L的终点P1的横坐标x1步进,取步长=1(个像素),用L的直线方程y=kx+b计算相应的y坐标,并取像素点(x,round(y))作为当前点的坐标。

因为:y i+1= kx i+1+b= k1x i+b+k∆x= y i+k∆x所以,当 x =1; y i+1= y i+k。

也就是说,当x每递增1,y递增k(即直线斜率)。

根据这个原理,我们可以写出DDA〔Digital Differential Analyzer〕画线算法程序。

DDA画线算法程序:void DDALine(int x0,int y0,int x1,int y1,int color){ int x;float dx, dy, y, k;dx = x1-x0;dy=y1-y0;k=dy/dx,;y=y0;for (x=x0;x< x1;x++){ drawpixel (x, int(y+0.5), color);y=y+k;}}注意:我们这里用整型变量color表示像素的颜色和灰度。

举例:用DDA方法扫描转换连接两点P0〔0,0〕和P1〔5,2〕的直线段。

x int(y+0.5) y0 0 01 02 13 14 2图3 直线段的扫描转换注意:上述分析的算法仅适用于|k| ≤1的情形。

基本图形生成算法

基本图形生成算法

Si (r 1, q)
(xi1, yi1)
y x dy dx
假设直线从 (x1, y1) 到 (x2 , y2 ) , 经变换后可表示为从 (0, 0) 到 (dx, dy) 其中 dx x2 x1 ,dy y2 y1 此时直线方程可简化为:
y dy x dx
(3 4)
将每一下标加1,即以i+1 代 i,则得:
di1 2xi dy 2 yidx 2dy dx
从 di1中减去 d i 得到:
di1 di 2dy(xi xi1) 2dx( yi yi1)
因为 xi xi1 1 ,重写上式得:
则令
dt 2m 所以
xinc dx 2m 1
yinc

dy
2m
1
即在x和y两个方向上,步长均小于1。若用硬件来实现对 称DDA法,则应用2套寄存器和加法器,将xinc和yinc分别加 到x和y的小数部分,哪个方向有整数溢出,就驱动该方向 走步。
数值微分法(DDA法)——特点
这种算法只需判断d的正负,其值的大小并不重要。 对于第一象限,因为分母 xM xA永远为正,所以只需 判断分子项的正负即可。我们得到偏差的判断公式 为:
FM yM xA yA xM
递推公式
用上式来计算偏差时,每次都要计算两次乘法,一 次减法,计算工作量还是很大的。如果我们设法用 前一点的偏差来推算走步方向以及走步以后的偏差, 则偏差计算就可以大大简化,也更适于计算机实现。 现在仍以第一象限为例,简述这种递推过程。
1
第五章 基本图形生成算法
图形生成的概念 直线段的扫描转换 圆的扫描转换 多边形的扫描转换与区域填充

椭圆的生成算法原理

椭圆的生成算法原理

椭圆的生成算法原理椭圆是数学中一个重要的几何图形,其形状类似于拉伸的圆,具有许多特殊的性质和应用。

椭圆的生成算法是指通过一系列步骤和公式来确定椭圆上各个点的坐标,即生成椭圆的过程。

下面将详细介绍椭圆的生成算法原理。

椭圆的生成算法主要有两种,一种是解析生成算法,另一种是数值生成算法。

1. 解析生成算法:解析生成算法是通过椭圆的几何性质以及数学公式来确定椭圆上各个点的坐标。

椭圆的数学定义是平面上到两个定点F1和F2的距离之和恒定的点的集合,这个距离之和被称为椭圆的焦距。

椭圆的生成算法可以通过以下步骤来实现:(1)确定椭圆的中心点坐标:椭圆的中心点坐标是椭圆坐标系的原点,可以通过给定的椭圆中心点位置来确定。

(2)确定椭圆的长轴和短轴长度:椭圆的长轴和短轴是确定椭圆形状的关键参数,可以通过给定的椭圆长轴长度和短轴长度来确定。

(3)确定椭圆的旋转角度:椭圆可以绕着中心点旋转一定角度,旋转角度可以通过给定的旋转角来确定。

(4)根据椭圆的数学公式确定椭圆上各个点的坐标:椭圆的数学公式为:x = a * cosθ,y = b * sinθ,其中a和b分别是椭圆的长轴和短轴长度,θ是点P在椭圆上的极角。

通过以上步骤,椭圆的生成算法能够确定椭圆上任意给定角度的点的坐标。

2. 数值生成算法:数值生成算法是通过数值计算的方法来确定椭圆上各个点的坐标。

常用的数值生成算法有Bresenham算法和中点画圆法。

(1)Bresenham算法:Bresenham算法是一种通过离散化的方法来绘制椭圆的生成算法。

该算法通过遍历椭圆的象限来确定椭圆上各个点的坐标,并在每个象限内使用Bresenham画线算法来绘制曲线。

(2)中点画圆法:中点画圆法是一种通过迭代计算的方法来绘制椭圆的生成算法。

该算法通过以椭圆的中心点为起点,按照逆时针方向遍历椭圆的一个象限,根据一个决策参数来确定椭圆上各个点的坐标。

这两种数值生成算法能够准确地绘制椭圆,适用于计算机图形学等领域。

第二章 基本图元的显示1

第二章 基本图元的显示1

图 形 学
第二章 基本图形元素的生成算法
(0,6)
(6,6)
(6,0)
(0,0) 计 算 机 图 形 学 (5,3)
(0,0)
第二章 基本图形元素的生成算法
扫描转换:通常把图像中的点、线、圆、区域和字符等图 形基本指令组成的显示文件转换成为显示缓冲器中图像的 位映像图的过程,成为扫描转换。 位图:是与屏幕图像每个像素点一一对应的图像矩阵, 矩阵中的每个元素就是像素的值(表示灰度级别与色 彩)。 选择扫描转换算法,速度与图像质量两者之间权衡折 衷。由于在建立一幅图形过程中,基本的图形扫描转 换算法将被调用成百上千此,因此,速度快一些是比 较可取的。
1 xi 1 x i x x i x x i 1 | x | 1 y i 1 y i y y i y y i k | y |
x=x-1;y=y-k; for(x=x1;x>=x2;x--) {putpixel(x,round(y));y=y-k;}
(X1,Y1)的像素点,对应的显示缓冲器地址为: 字节地址= S + ( H / 8 ) * Y1 + ( X1 / 8 ) 的整数部分 字节内的位地址= X1 / 8 的余数 计 算 机 图 形 学
第二章 基本图形元素的生成算法
2.1.2 直线段的生成
数学上的直线是由无数个点构成的集合,显 然,光栅显示器只能近地似显示直线。对 于水平、垂直和45°斜线是可以达到较为 满意的效果的。当我们对直线进行光栅化 时,需要确定最佳逼近该直线的一组象素。 扫描转换直线段就是计算出落在直线段上 或充分靠近它的一串像素,并以此像素近 似代替原连续直线段在屏幕上显示的过程。
计 算 机 图 形 学

计算机基本图形生成算法

计算机基本图形生成算法
给定圆心在原点,半径为整数R的圆,其方程为
x2 y2 R2
构造函数F(x,y)=x2+y2-R2。 对于圆上的点,有F(x,y)=0; 对于圆外的点,F(x,y)>0; 而对于圆内的点,F(x,y)<0。
31
y
Pu
PM
Pd
x
图5.13 中点Bresenham画圆的原理
中点Bresenham画圆
y
yi
k
19
改进的Bresenham算法
kd
k d
kd
k kd
图5.10 改进的Brensemham算法绘制直线的原理
改进的Bresenham算法——原理
xi1 yi1
xi
yi yi
1
1
(d 0.5) (d 0.5)
误差项的计算
d初=0, 每走一步:d=d+k
一旦y方向上走了一步,d=d-1
中点Bresenham画圆
判别式的初始值
d0 F ( x0 1, y0 0.5) F (1, R 0.5) 1 (R 0.5)2 R2 1.25 R
36
改进:用d-0.25代替d 此时有:
d d 2xi 3
d 0.25
d d 2(xi yi ) 5 d 0.25
yi-2
(xi 2)2 ( yi 0.5)2 R2
xi xi+1 xi+2
d2 ( xi 1 1)2 ( yi 0.5)2 R2 图5.14 d≤0的情况
( xi 1)2 2xi 3 ( yi 0.5)2 R2
d1 2xi 3
误差项的递推(d>0)
yi
P
yi-1
构造判别式:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与技术学院
2012-2013学年第一学期《计算机图形学》实验报告
班级:100341C
学号:100341328
姓名:魏然
教师:惠康华
成绩:
实验项目:直线、圆、椭圆的生成算法
一、实验目的与要求
(1)了解Visual C++等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境(IDE)下进行图形处理程序的设计方法。

(2)熟练掌握直线的3种扫描转换算法:DDA算法,中点算法和Bresenham算法。

(3)掌握中点画圆算法、圆的Brensenham算法和椭圆的中点算法。

二、实验内容
(1)在Visual C++环境中设计MFC单文档程序,利用消息处理函数,搭建能运行图形算法程序的平台。

(2)在平台中使用已有的点、线、圆等绘图函数,设计一个平面图形。

Visual C++基本绘图函数可参考有关文献。

(3)根据教材中给定的算法,实现直线段的3种生成算法:DDA算法,中点法和Bresenham算法。

(4)根据教材中给定的算法,实现圆与椭圆的生成算法。

三、重要算法分析
(一)、直线的生成
1、DDA算法
定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;
定义整型变量x,y,i;浮点数dx,dy,k;
根据数学算法得到斜率k,
k=dy/dx,其中dx=(float)(x1-x0),dy=(float)(y1-y0);
定义x=x0;y=y0;
通过对x和y各增加一个小增量,计算下一步的x、y值。

当k的绝对值小于1的时候,标记一个像素点,像素点的坐标为(x,int(y+0.5),c),y=y+k,如果x=x i,则停止;
当k的绝对值大于或等于1的时候,标记一个像素点,像素点的坐标为(int(x+0.5),y,c),x=x+1/k,如果y=y i,则停止;
2、中点算法
定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;
定义浮点数:a,b,d1,d2,d,x,y;
假设直线方程f(x,y)=ax+by+c=0,则a=y0-y1;b=x1-x0;判别式d=2*a+b;
d1=2*a;d2=2*(a+b);
定义x=x0;y=y0;
标记像素点(x,y,c);
x值逐一增加,y值取决于d;
当d大于等于0的时候,取正右方的点,上一步的d值加d1;
当d小于0的时候,取右上方的点,上一步的d值加d2;
3、Bresenham算法
定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;
定义整型变量 i,x,y,dx,dy;整型变量:k,e;
dx=x1-x0,dy=y1-y0;e=-dx;
定义x=x0;y=y0;
标记像素点(x,y,c),x逐一增加,e=e+2*dy,其中如果e>=0,则y增加,e=e-2*dx, 如果x=x i,则停止;
(二)、圆的生成
1、中点画圆
定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,d;
使x=0,y=r,d=1-r;
标记像素点(x,y,c);
当x<=y的时候,如果d<0,则d=d+2*x+3;否则d=d+2*(x-y)+5,y逐一减;
x逐一增加,
标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);
标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);
标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);
2、Bresenham画圆
定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,e;
浮点数e,d;
使x=0,y=r,e=3-2*r;
当x<=y的时候,如果e<0,则e=e+4*x+6,x逐一增加;否则e=e+4*(x-y)+10,x逐一增加,y逐一减;
标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);
标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);
标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);
四、程序运行截图
图1 直线的生成
图2 圆的生成
五、总结与调试经验
通过本次试验,我初步了解了怎样在计算机上进行图形处理,并且学会了怎样在Visual C++上创建生成图形的工程,用不同算法实现了直线和圆的生成,知道了各个算法之间的优缺点。

同时我也也意识到自己的编程能力不是很好,需要多做练习去提高。

相关文档
最新文档