直线,圆,椭圆生成算法

合集下载

计算机图形学第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不 可能出现。

计算机图形学-三种直线生成算法及圆的生成算法

计算机图形学-三种直线生成算法及圆的生成算法

计算机科学与技术学院2013-2014学年第一学期《计算机图形学》实验报告班级:110341C学号:110341328姓名:田野教师:惠康华成绩:实验(一):平面图形直线和圆的生成一、实验目的与要求1.在掌握直线和圆的理论基础上,分析和掌握DDA生成直线算法、中点生成直线算法、Bresenham生成直线算法、中点画圆算法、Bresenham圆生成算法。

2.熟悉VC6.0MFC环境,利用C语言编程实现直线和圆的生成。

3.比较直线生成三种算法的异同,明确其优点和不足。

同时了解圆的生成算法适用范围。

二、实验内容1.掌握VC6.0环境中类向导和消息映射函数的概念,并且为本次实验做好编程准备工作。

2. 用C语言进行编程实现上述算法,并且调试顺利通过。

3. 在MFC图形界面中显示不同算法下的图形,并且注意对临界值、特殊值的检验。

完成后保存相关图形。

三、算法分析➢DDA直线生成算法描述:1)给定一直线起始点(x0,y0)和终点(x1,y1)。

分别计算dx=x1-x0,dy=y1-y0。

2)计算直线的斜率k=dy/dx。

当|k|<1时转向3);当|k|<=1时,转向4);3)当x每次增加1时,y增加k。

即(xi,yi)→(xi+1,yi+k)。

直到xi增加到x1。

并且每次把得到的坐标值利用系统函数扫描显示出来。

但要注意对y坐标要进行int(y+0.5)取整运算。

结束。

4)对y每次增加1时,x增加1/k,即(xi,yi)→(xi+1/k,yi+1)。

直到yi增加到y1. 并且每次把得到的坐标值利用系统函数扫描显示出来。

但要注意对x坐标要进行int(x+0.5)取整运算。

结束。

➢中点生成算法描述:算法基本思想:取当前点(xp,yp),那么直线下一点的可能取值只能近的正右方点P1(xp+1,yp)或者P2(xp+1,yp+1)。

为了确定好下一点,引入了这两点中的中点M(xp+1,yp+0.5)。

这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。

直线和圆弧的生成算法

直线和圆弧的生成算法

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

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

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

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

3.1.1逐点比较法3.1.2数值微分(DDA)法设过端点P o(x o , y°)、R(X1 , y1)的直线段为L( P0 , R),则直线段L的斜率为—沁生要在显示器显示厶必须确定最佳逼近Z的掃素集合。

我们从L的起点P0的横坐标X o向L的终点R的横坐标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 DDALi ne(int xO,i nt yO,i nt x1,i nt y1,i nt color){ int x ;float dx, dy, y, k ;dx = x1-x0 ;dy=y1-y0 ;k=dy/dx, ;y=yO;for (x=xO ;x< x1 ;x++){ drawpixel (x, i nt(y+0.5), color);y=y+k;}}注意:我们这里用整型变量color表示像素的颜色和灰度。

椭圆的生成算法原理

椭圆的生成算法原理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

圆的生成算法

圆的生成算法

圆的生成算法利用直线坐标法和极坐标法生成圆周颇费时间,而圆的Bresenham算法则简捷很多。

一.圆的Bresenham算法思想:设圆的半径为r,先考虑圆心在(0,0),并从x=0、y=r开始的顺时针方向的1/8圆周的生成过程。

在这种情况下,x每步增加1,从x=0开始,到x=y结束。

即有X i+1=X i+1相应地yi+1则在两种可能中选择:Y i+1=y i或者y i+1=y i-1选择的原则是考虑精确值y是靠近yi还是靠近yi-1,计算公式为Y2=r2-(x i+1)2d1=y i2-y2=y i2-r2+(x i+1)2d2=y2-(y i-1)2=r2-(x i+1)2-(y i-1)2令pi=d1-d2,并代入d1、d2,则有P i=2(x i+1)2+y i2+(y i-1)2-2r2(1)Pi称为误差。

如果Pi<0,则yi+1=yi,否则yi+1=yi-1.pi的递归式为P i+1=p i+4x i+6+2(y i+12-y i2)-2(y i+1-y i) (2)P i的初值由式(1)代入xi=0,yi=r,而得P1=3-2r (3)根据上面的推导,圆周生成算法思想如下:(1)求误差初值,p1=3-2r,i=1,画点(0,r);(2)求下一个光栅位置,其中x i+1=x i+1,如果p i<0,则y i+1=y i,否则y i+1=y i-1;(3)画点(x i+1,y i+1);(4)计算下一个误差,如果p i<0,则p i+1=p i+4x i+6,否则p i+1=p i+4(x i-y i)+10;(5)I=i+1,如果x=y,则结束,否则返回步骤2;虽然(1)式表示p i+1的算法很复杂,但因为y i+1只能y i或y i-1,使得步骤(4)的算法变得简单,只需做加法和乘4的乘法。

圆的Bresenham算法的程序实现如下:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<graphics.h>void BresenhemCircle(int centerx, int centery, int radius, int color, int type);void initgr(void) /* BGI初始化*/{int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果*/ registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行*/ initgraph(&gd, &gm, "");setbkcolor(WHITE);}int main(void){int centerx,centery,radius,color,type;printf("centerx,centery\n");scanf("%d",&centerx);scanf("%d",&centery);printf("radius\n");scanf("%d",&radius);printf("color,type\n");scanf("%d",&color);scanf("%d",&type);initgr(); /*BGI初始化*/BresenhemCircle(centerx,centery,radius,color,type);getch();closegraph();}void BresenhemCircle(int centerx, int centery, int radius, int color, int type){int x =type= 0;int y = radius;int delta = 2*(1-radius);int direction;while (y >= 0) {if (!type) {putpixel(centerx+x, centery+y, color);putpixel(centerx-x, centery+y, color);putpixel(centerx-x, centery-y, color);putpixel(centerx+x, centery-y, color);}else {line(centerx+x, centery+y, centerx+x, centery-y);line(centerx-x, centery+y, centerx-x, centery-y);}if (delta < 0) {if ((2*(delta+y)-1) < 0) {direction = 1;}else {direction = 2;}}else if(delta > 0) {if ((2*(delta-x)-1) <= 0) {direction = 2;}else {direction = 3;}}else {direction=2;}switch(direction) {case 1:x++;delta += (2*x+1);break;case 2:x++;y--;delta += 2*(x-y+1);break;case 3:y--;delta += (-2*y+1);break;}}}二.中心画圆法圆的特性:八对称性。

圆及圆弧生成算法

圆及圆弧生成算法

圆及圆弧生成算法圆及圆弧生成算法是计算机图形学中常用的算法之一,用于生成圆及圆弧的几何形状。

圆是一个闭合曲线,由一系列连续的点组成,其到中心点的距离都相等。

圆弧是圆的一部分,也是由一系列点组成的曲线。

下面将介绍几种常见的圆及圆弧生成算法。

1.中点圆生成算法:中点圆生成算法是一种常用的生成圆形的算法。

该算法从圆心开始,逐步生成圆上其它点的坐标,直到生成整个圆。

算法的基本思想是在每一步中选择一个点,使得该点的距离到圆的实际弧路径最接近满足圆方程的距离。

具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为1-r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+2x+3,x=x+1,y=y;-如果d>=0,则令d=d+2x-2y+5,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。

2. Bresenham圆生成算法:Bresenham圆生成算法是基于中点圆生成算法的改进。

该算法的主要思想是通过对称性减少计算量,较中点圆生成算法更快速。

具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为3-2r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。

3.中点圆弧生成算法:中点圆弧生成算法是用于生成圆弧的算法。

该算法通过给定圆心、弧的起始点和终止点,计算圆弧上的所有点的坐标。

具体步骤如下:(1)初始化圆心、起始点和终止点坐标;(2)计算圆上点的初始参数值d,初始值根据起始点和终止点的位置关系计算得到;(3)按递增顺序计算圆弧上的点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;-输出当前点的坐标;(4)重复步骤(3)直到到达终止点。

算法之椭圆的生成算法

算法之椭圆的生成算法

椭圆和直线、圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图形学软件中最常见的生成算法之一。

在平面解析几何中,椭圆的方程可以描述为(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,就会产生一些跳跃的点,最后生成的光栅位图圆弧会有一些突变的点,看起来好像不在圆弧上。

lesson04-圆与椭圆的生成算法

lesson04-圆与椭圆的生成算法

Si+1 (xi-1+2,yi-1-1),Ti+1 (xi-1+2,yi-1-2)
di+1=[(xi-1+2)2+(yi-1-1)2-R2]+[(xi-1+2)2+(yi-1-2)2 -R2]
di+1-di=4(xi-1- yi-1)+10
di+1=di+4(xi-1-yi-1)+10
即得di的递归式:
void CirclePoints(int x,int y,int color)
{
drawpixel(x,y,color); drawpixel(y,x,color);
drawpixel(-x,y,color); drawpixel(y,-x,color);
drawpixel(x,-y,color); drawpixel(-y,x,color);
begin
4. 输出点(x,y)以及其他7点(y,x),(-x,y), (-y,x),(-y,-x),(-x,-y),(x,-y),(y,-x)
5. if d<0 then d=d+4·x+6 6. else d=d+4·(x-y)+10,y=y-1
7. x=x+1 end
8. if x=y then 输出点(x,y)以及(-x,y),(-x,-y),(x,-y)
[(x-xc)/rx]2+[(y-yc)/ry]2=1 其中:rx 和ry分别为长半轴和短半轴。 • 极坐标表示:
x=xc+rxcosθ,y=yc+rysinθ • 标准位置的椭圆其在四分象限是对称的,
因此我们只需要计算一个四分象限的椭圆 曲线位置,然后根据对称性得到其余的部 分。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章 直线、圆、椭圆生成算法
3.1直线段扫描转换 3.2圆弧扫描转换
3.3椭圆弧扫描转换
3.2圆的扫描转换算法
•角度DDA法 •中点画圆法
•Bresenham画圆算法
•生成圆弧的正负法 •圆的内接正多边形逼近法
下面仅以圆心在原点、半径R为整数的圆为例, 讨论圆的生成算法。 假设圆的方程为: 2 2 2 X + Y = R
数值微分(DDA)法
• 例:画直线段P0(0,0)--P1(5,2)
x 0 1 2 3 4 5 int(y+0.5) 0 0 1 1 2 2 y+0.5 0+0.5 0.4+0.5 0.8+0.5 1.2+0.5 1.6+0.5 2.0+0.5
Line: P0(0, 0)-- P1(5, 2) 3 2 1 0 1 2 3 4 5
中点画线法
• 例:用中点画线法P0(0,0) P1(5,2)
a=y0-y1=-2 b=x1-x0=5 d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
i 1 2 3 4
xi 0 1 2 3
yi 0 0 1 1 2
d 1 -3 3 -1 5
3 2 1 0 1 2 3 4 5
5 4
Bresenham画线算法
对于圆心在(x0,y0)、半径为r的圆,先对圆心在原 点,半径为r的8分圆进行扫描转换,每确定一个象素,可 输出原始圆的8个点。
• void Circle8Points(int x0,int y0, int x,int y,COLORREF c) • { • drawpixel (x0+x,y0+y,c); • drawpixel (x0-x,y0+y,c); • drawpixel (x0+x,y0-y,c); • drawpixel (x0-x,y0-y,c); • drawpixel (x0+y,y0+x,c); • drawpixel (x0-y,y0+x,c); • drawpixel (x0+y,y0-x,c); • drawpixel (x0-y,y0-x,c); • }
P2 Q P1
中点画线法
若d0->M在直线上方->取P1; 此时再下一个象素的判别式为 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)+c = a(xp +1)+b(yp +0.5)+c +a =d+a; 增量为a
P2 Q
P=(xp,yp) P1
中点画线法
• 若d<0->M在直线下方->取P2; • 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c = a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
中点画线法
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1; b=x1-x0; d=2*a+b; d1=2*a ; d2=2* (a+b); x=x0; y=y0; drawpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
数值微分(DDA)法
• 增量算法:在一个迭代算法中,如果每一 步的x、y值是用前一步的值加上一个增量 来获得,则称为增量算法。 • DDA算法就是一个增量算法。
数值微分(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; xx1; x++) drawpixel (x, int(y+0.5), color); y=y+k;

栅格交点表示象素点位置
(X i+1 ,Yi + k)

(X i , Int(Yi +0.5))
数值微分(DDA)法
•基本思想
已知过端点P0 (x0, y0), P1(x1, y1)的直线段L y=kx+b 直线斜率为 y1 y0
k
x1 x0
令x x0 x1; x x stepx y kx b x, round( y)
P1 M P2
2 2 2
中点画圆法
有如下结论: F(M)< 0 ->M在圆内-> 取P1 F(M)>= 0 ->M在圆外-> 取P2 为此,可采用如下判别式:
P1 M P2
中点画圆法
d = F(M) = F(xp + 1, yp - 0.5) 2 2 2 =(xp + 1) + (yp - 0.5) - R
这种方法直观,但效率太低,因为每一步需要一次浮点乘法 和一次舍入运算。
数值微分(DDA)法
计算yi+1= kxi+1+b = kxi+b+kx = yi+kx 当x =1; yi+1 = yi+k
• 即:当x每递增1,y递增k(即直线斜率); • 注意上述分析的算法仅适用于k ≤1的情形。 在这种情况下,x每增加1,y最多增加1。 • 当 k 1时,必须把x,y地位互换
八分法画圆
• 利用圆的对称性
y y=-x
(-y,x)
(y,x)
y=x
(-x,y)
(-x,-y)
(x,y)
(x,-y)
(-y,-x)
(y,-x)
• 结论:只需对一个八分圆进行图5-10 1/8圆弧
3)画任意圆的方法
当圆心坐标(xc ,yc ) ,半径为整数r时:
(x-xc)2+(y-yc)2=r2 可以先对圆心坐标(0 ,0 ) ,半径为r的八 分圆进行扫描转换,根据圆的对称性,得到 八个对称点,再将这八个点进行平移,即可 得到原始圆上的对应点。
P2 Q
P=(xp,yp) P1
中点画线法
• 画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0 +0.5)+c = F(x0, y0)+a+0.5b = a+0.5b
由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d来摆脱小数,提高效率。
中点画圆法
利用圆的对称性,只须讨论1/8圆。第二个8分圆
P(Xp ,Yp )
P1
M P2
P为当前点亮象素,那么,下一个点亮的象素可 能是P1(Xp+1,Yp)或P2(Xp +1,Yp -1)。
中点画圆法
构造函数:F(X,Y)=X + Y - R ;则 F(X,Y)= 0 (X,Y)在圆上; F(X,Y)< 0 (X,Y)在圆内; F(X,Y)> 0 (X,Y)在圆外。 设M为P1、P2间的中点,M=(Xp+1,Yp-0.5)
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2 Q
P=(xp,yp) P1
∴欲判断M点是在Q点上方还是在Q点下方, 只需把M代入F(x,y),并检查它的符号。
中点画线法
构造判别式: d=F(M)=F(xp+1,yp+0.5) =a(xp+1)+b(yp+0.5)+c 当d<0,M在直线(Q点)下 P=(xp,yp) 方,取右上方P2; 当d>0,M在直线(Q点)上 方,取右方P1; 当d=0,选P1或P2均可, 约定取P1; 能否采用增量算法呢?
为能确定B在A点上面或下面,令 ε(xi+1)=yi+1-yir-0.5 (2)
若B在A的下面,则有ε(xi+1)<0,反之, 则ε(xi+1)>0。由图可知 yi+1,r=yir+1,若ε(xi+1)≥0 yi+1,r=yir, 若ε(xi+1)≤0 (3)
Bresenham画线算法
由式(2)和式(3)可得到 ε(xi+2)=yi+2 - yi+1,r - 0.5 =yi+1 + k - yi+1,r - 0.5 (4) yi+1 - yir -0.5 + k - 1,当ε(xi+1)≥0 yi+1 - yir -0.5 + k, 当ε(xi+1)≤0 ε(xi+2)= ε(xi+1) + k -1 ,当ε(xi+1)≥0 ε(xi+2)= ε(xi+1) + k , 当ε(xi+1)≤0 由式(2)可得到 ε(x2)=y2-yr-0.5 =-0.5 (5)
若d<0, 则P1 为下一个象素,那么再下一个象素 的判别式为:
相关文档
最新文档