直线、圆、椭圆的生成算法
第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章 基本图形生成算法
例题:有点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讲:直线及圆生成算法
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
图 形 学
第二章 基本图形元素的生成算法
(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°斜线是可以达到较为 满意的效果的。当我们对直线进行光栅化 时,需要确定最佳逼近该直线的一组象素。 扫描转换直线段就是计算出落在直线段上 或充分靠近它的一串像素,并以此像素近 似代替原连续直线段在屏幕上显示的过程。
计 算 机 图 形 学
计算机基本图形生成算法
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
构造判别式:
算法之椭圆的生成算法
椭圆和直线、圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图形学软件中最常见的生成算法之一。
在平面解析几何中,椭圆的方程可以描述为(x – x0)2 / a2+ (y – y0)2 / b2 = 1,其中(x0, y0)是圆心坐标,a 和b是椭圆的长短轴,特别的,当(x0, y0)就是坐标中心点时,椭圆方程可以简化为x2 / a2 + y2 / b2 = 1。
在计算机图形学中,椭圆图形也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。
为了简化,我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。
在进行扫描转换之前,需要了解一下椭圆的对称性,如图(1)所示:图(1)椭圆的对称性中心在原点。
焦点在坐标轴上的标准椭圆具有X轴对称、Y轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x, -y)、(-x, y)和(-x, -y)。
因此,只要画出第一象限的四分之一椭圆,就可以利用这三个对称性得到整个椭圆。
在光栅设备上输出椭圆有很多种方法,可以根据直角平面坐标方程直接求解点坐标,yekeyii利用极坐标方程求解,但是因为涉及到浮点数取整,效果都不好,一般都不使用直接求解的方式。
本文就介绍几种计算机图形学中两种比较常用的椭圆生成方法:中点画椭圆算法和Bresenham椭圆生成算法。
1、中点画椭圆法中点在坐标原点,焦点在坐标轴上(轴对齐)的椭圆的平面集合方程是:x2 / a2 + y2 / b2 = 1,也可以转化为如下非参数化方程形式:F(x, y) = b2x2 + a2y2 - a2b2 = 0 (方程 1)无论是中点画线算法、中点画圆算法还是本节要介绍的中点画椭圆算法,对选择x方向像素Δ增量还是y方向像素Δ增量都是很敏感的。
举个例子,如果某段圆弧上,x方向上增量+1个像素时,y方向上的增量如果 < 1,则比较适合用中点算法,如果y方向上的增量 > 1,就会产生一些跳跃的点,最后生成的光栅位图圆弧会有一些突变的点,看起来好像不在圆弧上。
计算机图形学基本图形生成算法
y= k· x+b
k=0.571429
b=0.428571
2 X[0]=1 y0 X[1]=2
Y[0]=1 Y[0]=1 Y[1]=kx[1]+b=1.57 Y[1]=y0+k=1.57 Y[2]=y1+k=2.14 Y[2]=kx[2]+b=2.14 Y[3]=y2+k=2.71 Y[3]=kx[3]+b=2.71 Y[4]=y3+k=3.28 Y[4]=kx[4]+b=3.28 Y[5]=y4+k=3.85 Y[5]=kx[5]+b=3.85 Y[6]=y5+k=4.4 Y[6]=kx[6]+b=4.4 Y[7]=5 Y[7]=5
第3章 基本图形生 成算法
1 直线生成算法(DDA、BRES) 2 圆生成算法(Mid) 3 多边形填充算法(扫描线、区域) 4 字符图元算法
2015/4/19
1
图元
• 图元:图形软件包中用了描述各种几何 图形元素的函数称为图形输出原语,简 称图元。 • 描述对象几何要素的输出图元一般称为 几何图元。点的定位和直线段是最简单 的几何图元。 • 在选定坐标系中指定一个图形的几何要 素后,输出图元投影到该输出设备显示 区域对于的二维平面上,并扫描转换到 帧缓存的整数像素位置。
2015/4/19
5
1 直线生成算法(DDA、BRES) 2 圆生成算法(Mid) 3 多边形填充算法(扫描线、区域) 4 字符图元算法
1 直线的DDA算法
2015/4/19
6
OpenGL画点和画线函数 1) 画点函数 glVertex*( ); (*={234}{sifd}[v]) 表示该函数有后缀,指 明空间尺寸、坐标数据类型或向量形式描述。 Ex: glBegin(GL_POINTS); glVertex2i(100,50); glEnd(); glBegin(GL_POINTS); glVertex2i(100,50); glVertex2i(75,90); glVertex2i(300,590); glEnd();
04 基本图形(元)生成技术
if (d<0) { x++; y++; d+=delta2; //取P2,并且计算下一点的d值 } else { x++; d+=delta1; //取P1,并且计算下一点的d值 } putpixel(x,y,color); } }
当|k|≤1时,让x每步增加1,y最多增加1,
然后用四舍五入的方法来确定直线上的
像 素 位 置 为 (x,round(y)) 。 设 当 前 点 为 (xi,yi),则下一个像素xi+1 = xi +1,则 yi+1 =k xi+1 +B =k(xi+1)+B=(k xi +B)+k = yi +k 即当x每递增1时,y递增斜率k。
即可。
算法举例:
设直线的起点为(0,0),终点为(5, 3),按Bresenham 算法计算并确定个 像素点位置。
计算dx=5,dy=3,k=3/5=0.6,误差e=-0.5; x=0,y=0
(1) i=0: 输出像素(0,0)
x=1,e=e+k=-0.5+0.6=0.1>0, 则 有
y=y+1=1,e=e-1=0.1-1=-09
其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0。
对于直线中的点,则有F(x,y)=0;对于直 线上方的点,则有F(x,y)>0;对于直线下 方的点,则有F(x,y)<0。
• 判断中点M在Q的上方,还是 在下方,只要将中点坐标 M(xi+1,yi+0.5) 代 入 F(x,y) 方 程 中,并判断它的符号。构造判 别式
基本图形的生成与计算-直线、圆、椭圆的生成
02
圆生成与计算
圆方程及性质
圆的标准方程
$(x-a)^2+(y-b)^2=r^2$,其中 $(a,b)$为圆心坐标,$r$为半径。
圆的性质
圆上任意一点到圆心的距离等于 半径;圆的任意两条直径互相平 分;垂直于弦的直径平分该弦。
圆绘制算法
确定圆心和半径
根据实际需求或已知条件确定圆 心和半径。
使用图形库
使用参数方程来表示图形的形状和位置 。参数方程可以是显式的或隐式的,可 以是二维的或三维的。参数方程表示法 可以方便地描述复杂的曲线和曲面。
VS
矩阵表示法
使用矩阵来表示图形的变换和操作。矩阵 表示法可以统一处理平移、旋转、缩放等 变换,使得计算更加简洁和高效。同时, 矩阵表示法也便于进行图形的复合变换和 复杂操作。
图形组合与拆分
图形组合
将多个图形组合成一个复杂的图形。组合方式可以是叠加、相交、相减等。组合后的图形可以具有更 加丰富的形状和特性。
图形拆分
将一个复杂的图形拆分成多个简单的图形。拆分方式可以是沿着边界、中心点、特定点等进行拆分。 拆分后的图形可以更容易地进行处理和分析。
图形参数化表示
参数方程表示法
将图形的大小按比例缩放。缩放因子可以是 任意正数,大于1表示放大,小于1表示缩小 。缩放可以沿着不同的轴进行,得到不同的 效果。
对称和对齐操作
对称操作
将图形关于某一直线或点进行对称。对称轴可以是任意直线,对称点可以是任意点。对称操作可以得到原图形 的镜像。
对齐操作
将图形与另一图形或坐标系进行对齐。对齐可以是水平对齐、垂直对齐或中心对齐等。对齐操作可以使得图形 在视觉上更加整齐和美观。
03
椭圆生成与计算
(二)点、线、面图形生成技术(精)
2.圆的生成算法
中点圆算法 角度DDA画圆算法
中点圆算法
利用圆的对称性,只须讨论1/8圆。
P(xp,yp) P1 M P2
1. 直线的生成算法
逐点比较法(续)
• 产生递推公式: 设画笔当前位置为M1(x1, y1),此时 F1=y1xA-yAx1<0, 下一点应为 x2=x1 A(xA, yA) M(xM, yM)
y2=y1+1
M2处的偏差为 F2=y2xA-yAx2 =y1xA+xA-yAx1=F1+xA 若F2>=0 x3=x2+1
else interchange=0; f=2*deltay-deltax; for(int i=1;i<=deltax;i++) { pDC->SetPixel(x,y,color); if(f>=0) { if(interchange==1) x=x+s1; else y=y+s2; f=f-2*deltax;} if(interchange==1) {y=y+s2;} else x=x+s1; f=f+2*deltay; } }
(二)点、线、面图形生成技术
1. 2. 3. 4.
5.
6.
直线的生成算法 圆的生成算法 椭圆的生成算法 其他曲线 填充区域图元 字符生成
1. 直线的生成算法
即是找出逼近直线的一组象素,按扫描 线顺序,对这些象素进行写操作。
逐点比较法
数值微分画线法(DDA) Bresenham画线算法
1. 直线的生成算法
逐点比较法
是绘图仪经常采用的方法。 设要画的直线段两端点 OA(xO, yO), (xA, yA). x= xO+(xA –xO)t y= yO+(yA –yO)t 令 t=ti=i/n (i=0, 1, …, n) 则可得到点列 xi= xA+(xB –xA)ti yi= yA+(yB –yA)ti Mi=([xi], [yi])就是该直线线段上的第i 个象素点,n+1个象素点可以构成直线 段OA。 n=max(│ xo –xA│, │ yo –yA│)
基本图形生成算法原理
基本图形生成算法原理现在的计算机能够生成各种复杂的图形,但无论其多么复杂,它都是由一些基本图形组合而成的。
因此,学习基本图形的生成算法是掌握计算机图形的基础。
本章就主要讨论一些基本图形的生成原理,如点、直线、椭圆生成。
如前面所述,目前我们使用的主要图形输出设备显示器(一般为光栅图形显示器)和打印机(喷墨、激光打印机)本质上是一种画点设备,是由一定数量的网络状细小光点(即像素)组成,使某些像素亮(将帧缓存中对应位置的值为1)和某些像素不亮(将帧缓存中对应位置的值为0)来显示图形。
因此,基本图形生成的原理是指在点阵输出设备的情况下,如何尽可能地输出最接近于原图形(理想图形)的直线或曲线图形,即以最快的速度确定最佳逼近于图形的像素集。
确定图形的像素集合并显示的过程常称之为图形的扫描转换或光栅化。
这一过程使用的计算方法称之为图形生成算法。
1 点2 直线段的生成直线是点的集合,几何学中的一条直线是由两点决定,直线在数学上可以有多种表示方法,而在计算机图形学里,直线是由离散的像素点逼近理想直线段的点的集合。
数学上的直线是没有宽度的,而计算机图形学中显示出的直线的宽度与像素点的大小有关,一个像素宽的直线的线粗为像素的边长。
由计算机生成的图形中有大量的直线段,而且曲线也是由一系列短直线段逼近生成的。
因此,研究直线生成的方法是计算机图形学的基本问题之一。
对计算机生成直线的一般要求是:线段端点的位置要准确;构成线段的像素点的集合应尽可能分布均匀,其密度应该与线段的方向及长度无关;线段生成的速度要快。
生成直线的算法有多种,这里仅介绍两种方法,即DDA 算法和Bresenham 算法。
2.1 直线DDA 算法该直线生成算法称为数值微分算法(Digital Differential Analyzer 简称DDA )。
它是一种根据直线的微分方程来产生直线的方法。
设直线的起点坐标为),(s s y x ,终点坐标为),(e e y x ,则=dx dy k xy x x y y s e s e =∆∆=-- (3-1)k 是直线的斜率。
椭圆的绘制的原理
椭圆的绘制的原理椭圆是数学中一种非常重要的曲线,它在几何学和物理学中都有广泛的应用。
椭圆的绘制原理可以从多个角度来解释,下面将详细介绍几种常见的方法。
一、基于焦点和直线的定义椭圆可以定义为到两个固定点(焦点)的距离之和等于常量的点的轨迹。
如果我们假设这两个焦点分别为F1和F2,二者之间的距离为2a。
对于任意一点P(x, y),其到F1的距离为d1,到F2的距离为d2,则有d1 + d2 = 2a。
根据这个定义,我们可以得出弦长公式:PF1 + PF2 = 2a = P1P2。
在绘制椭圆时,我们可以先确定焦点的位置和椭圆的长轴(2a的长度),然后通过将椭圆分成很多小段,计算每个小段的坐标点,并将它们连接起来,就可以绘制出整个椭圆。
根据椭圆的对称性,我们只需绘制出上半部分,然后再将其镜像得到整个椭圆。
二、基于参数方程的定义椭圆还可以通过参数方程来定义,参数方程为:x = a * cos(t),y = b * sin(t),其中a和b是椭圆的半长轴和半短轴的长度,t是一个参数,范围为0到2π。
参数方程的原理是通过改变参数t的取值,计算出相应的x和y,然后将它们连接起来形成曲线。
在绘制椭圆时,我们可以按照一定的步长从0到2π逐渐改变参数t的值,计算出对应的x和y坐标,并将它们连线形成椭圆的轮廓。
与基于焦点和直线的定义相比,参数方程的方法更加直观和简便,适用于计算机绘图等领域。
三、基于二次方程的定义椭圆还可以通过二次方程来定义,椭圆的一般方程为:Ax²+ By²+ Cxy + Dx + Ey + F = 0,其中A、B、C、D、E和F是常数,且A和B不同时为零。
通过对一般方程进行适当的平移和旋转变换,我们可以得到椭圆的标准方程:(x - h)²/ a²+ (y - k)²/ b²= 1,其中(h, k)为椭圆的中心坐标,a和b是椭圆的半长轴和半短轴的长度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++上创建生成图形的工程,用不同算法实现了直线和圆的生成,知道了各个算法之间的优缺点。
同时我也也意识到自己的编程能力不是很好,需要多做练习去提高。