计算机图形学-设计算法绘制直线与圆

合集下载

计算机图形学,直线,圆,二维变换

计算机图形学,直线,圆,二维变换

实验一、直线的生成实验目的:1、掌握DDA直线画法、中点画线法和Bresenham画线法2、掌握VC++简单程序设计方法实验内容:根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。

实验步骤和方法:首先启动Visual C++ 6.0(注意,其它版本程序无法正确编译),文件(file)→打开工作空间(open workspace)。

打开实验12用基本图形生成\基本图形生成.dsw。

在fileview窗口,source file下,双击直线生成view.cpp,或者classview窗口下,cmyview类下相应的函数,按注释改写下列函数:void CMyView::OnDdaline() (此为DDA生成直线)void CMyView::OnBresenhamline()(此为Bresenham画直线)void CMYView::OnMidPointLine()(此为中点画线法)程序代码说明:1、直线的两个端点,由对话框输入,给定程序已经完成输入代码。

2、SetPixel的用法:COLORREF SetPixel(int x, int y, COLORREF crColor);//x,y为坐标点。

COLORREF SetPixel(POINT point, COLORREF crColor);//point为坐标点。

3、本实验事先提供DDA话直线的函数示范(红色部分是重点,其它部分可以不看)中点画直线函数和BresenHam画直线函数由同学们参照dda直线的示例函数自己完成。

//以下为DDA画直线的源程序float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束//以下为中点画直线的源程序float a,b,d1,d2,d,x,y;a=ya-yb,b=xb-xa,d=2*a+b;d1=2*a,d2=2*(a+b);x=xa,y=ya;pdc->SetPixel(x,y,COLOR);while(x<xb){ if(d<0){x++,y++,d+=d2;}else {x++,d+=d1;}pdc->SetPixel(x,y,COLOR);}//中点画直线结束//以下为Bresenham画直线的源程序int i,s1,s2,interchange;float f,x,y,deltax,deltay,temp; x=xa;y=ya;deltax=abs(xb-xa);deltay=abs(yb-ya);if(xb-xa>=0)s1=1;else s1=-1;if(yb-ya>=0)s2=1;else s2=-1;if(deltay>deltax){ temp=deltax;deltax=deltay;deltay=temp;interchange=1;}else interchange=0;f=2*deltay-deltax;pdc->SetPixel(x,y,COLOR);for(i=1;i<=deltax;i++){ if(f>=0){if(interchange==1) x+=s1;else y+=s2;pdc->SetPixel(x,y,COLOR);f=f-2*deltax;}else {if(interchange==1) y+=s2;else x+=s1;f=f+2*deltay;}}}//Bresenham画直线结束实验二、圆的生成(中点和Bresenham法)实验目的:1、掌握bresenham画圆的算法。

基本图形生成算法-直线圆弧

基本图形生成算法-直线圆弧

1 / max( x , y )
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——数值微分法
绘制直线时,要确定一个方向的增量为单位增量,即确定 画线的基本步进方向,另一个方向的增量由直线的斜率决
定。确定基本步进方向的依据是理想直线的斜率k。
DDA算法是一种增量算法,优点是直观、易于实现;
缺点是要做浮点运算和舍入取整,不利于硬件实现。
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——数值微分法
斜率<=1时,以x为基本 步进方向,x方向每次步 进增量为1。
斜率>1时,以y为基 本步进方向,y方向 每次步进增量为1。
第二象限 第四象限
走笔 +Y 走笔 -Y Fk+1=Fk-|xA |
走笔 -X 走笔 +X Fk+1=Fk+|yA |
逐点比较法绘制直线.doc
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换
【注】递推公式的作用: 意义:简化计算过程,提高效率。 原则:尽可能以加减法代替乘除法。 方法:用当前点的偏差推算出走笔方向,并计算出下一
Fi 1 xA yi 1 y A xi 1
即第i+1点的偏差判别式为:
xA ( yi 1) y A xi Fi x A
广东工业大学机电学院图学与数字媒体工程系
计算机图形学基础:基本图形生成算法——直线及圆弧的扫描转换 直线的扫描转换——逐点比较法
各象限的判别式

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

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

计算机科学与技术学院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)。

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

计算机图形学第二讲 直线和圆的生成

计算机图形学第二讲 直线和圆的生成

直线DDA算法思想
选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向 上的增量为一个象素单位(△x=1),然后利用公式计算另一个方向的增量 (△y=△x· m=m)。通过递推公式,把每次计算出的(xi+1,yi+1)经取整后送到 显示器输出,则得到扫描转换后的直线。 之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的 象素应均匀,这在下图中可看出。
直线Bresenham算法描述
我们来分析公式d1-d2=2m(xi+1)-2yi+2b-1 (1)当此值为正时,d1>d2,说明直线上理论点离(xi+1,yi+1)象素较近, 下一个象素点应取(xi+1,yi+1)。 (2)当此值为负时,d1<d2,说明直线上理论点离(xi+1,yi)象素较近,则 下一个象素点应取(xi+1,yi)。 (3)当此值为零时,说明直线上理论点离上、下两个象素点的距离相等, 取哪个点都行,假设算法规定这种情况下取(xi+1,yi+1)作为下一个象素点。 因此只要利用(d1-d2)的符号就可以决定下一个象素点的选择。
另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还 是负值。
直线DDA算法实现
Void DDALine(int x1,int y1,int x2, int y2,int color) { int x; float k,y=y1; k=1.0*(y2-y1)/(x2-x1); for(x=x1;x<=x2;x++) { putpixel(x, (int)(y+0.5),color); y=y+k; } }

直线和圆弧的生成算法

直线和圆弧的生成算法

第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表示像素的颜色和灰度。

直线和圆弧的生成算法

直线和圆弧的生成算法

第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的情形。

计算机图形学作业(中点法画直线和八分画圆法)

计算机图形学作业(中点法画直线和八分画圆法)
y=y1;y1=y0;y0=y;
}
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
d=dx-2*dy;
up=2*x-2*y;
down=-2*dy;
while(x<=x1){
pDC->SetPixel(x,y,color);
x++;
if(d<0){
y++;
d+=up;
}
else d+=down;
}
}
void CMy213View::OnButton32772()
{
CDC *pDC;
pDC=this->GetDC();
int x0=50,y0=50,x1=300,y1=300,color=333;
MidBresenhamLine(pDC,x0,y0,x1,y1,color);
this->ReleaseDC(pDC);
计算机图形学作业中点法画直线和八分画圆法计算机图
1、中点法画直线:
void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){
int dx,dy,){
x=x1;x1=x0;x0=x;
}
x++;
}
}
void CmbView::Onbbb()
{
CDC *pDC;
pDC=this->GetDC();
int r=60,color=333;
MidBresenhamCircle(pDC,r,color);
this->ReleaseDC(pDC);

计算机图形学-直线、圆、椭圆的生成

计算机图形学-直线、圆、椭圆的生成

2014-9-5
中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2
Q
P=(xp,yp) P1
2014-9-5 浙江大学计算机图形学 28
圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制 1/8 圆的中点 Bresenham 算法原理,根据对称 性可以绘制整圆 。
2014-9-5 浙江大学计算机图形学 22
设图中xi列上已用(xi,yir)作为表示直线的点, 又设B点是直线上的点,其坐标为(xi+1,yi+1),显然 下一个表示直线的点( xi+1,yi+1,r)只能从图中的C 或者D点中去选。设A为CD边的中点。 若B在A点上面 则应取D点作为( xi+1,yi+1,r),否则应取C点。
P=(xp,yp ) P1 浙江大学计算机图形学
16
中点画线法

若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

计算机图形学 第3章 直线与圆

计算机图形学 第3章 直线与圆

(2)ei的递推
ei x(d1 d 2 ) 2 y xi 2 x yi c
ei 1 2 y xi 1 2 x yi 1 c
代入x的增量为1,则 ei 1 ei 2 y 2 x ( yi 1 yi ) 如果选择右上方像素, y 即: i 1 yi 1 ,则: ei 1 ei 2y 2x 如果选择右方像素,即:yi1 yi ,则:ei 1 ei 2y
if(d<0) d=d+4*x+6;
else d=d+4*x-4*y+10, y=y--;
x++;
}
yi1 yi
ei 1 ei 2y
思路: x从x0开始,每次给予增量1,计算对应的y。 事实上,y只有2个选择,即yi或yi+1,可以 寻找一个判断方法,而不按方程进行计算。
线段(0,0),(5,2) Δy=2,Δx=5,2Δy-2Δx= -6,2Δy=4 , e0 = 2Δy-Δx = -1 x y e ----------------------------0 0 -1 1 0 3 2 1 -3 3 1 1 4 2 -5 5 2
ei 1 ei 2 y ( xi 1 xi ) 2 x ( yi 1 yi )
上述公式假设Δx>Δy>0 e0 = 2Δy- Δx xi+1=xi+1 if ei>0 yi+1=yi+1,ei+1=ei+2Δy-2Δx else yi+1=yi ,ei+1=ei+2Δy 共包含8种情况,其他情况可以类似地进行推导
直线扫描转换的数值微分算法: k=(y1-y0)/(x1-x0), x0=x0, y0=y0

计算机图形学课程设计报告--直线和圆中点Bresenham算法

计算机图形学课程设计报告--直线和圆中点Bresenham算法

计算机图形学课程设计报告课题名称直线和圆中点Bresenham算法1、课程设计目的 (2)2、课程设计描述及要求 (2)3、系统开发环境 (2)4、直线的Bresenham算法原理 (2)4.1中点Bresenham算法 (2)4.2该进的Bresenham算法 (5)5、圆的Bresenham算法原理 (7)6、程序运行结果 (9)7、总结 (11)8、参考资料 (11)9、附录 (11)计算机图形学课程设计报告1.课程设计目的本学期系统学习了计算机图形学的概论原理,在学期期末按课程要求进行实验。

通过实验,进一步理解和掌握中点算法、Bresenham 算法和二阶差分算法, 并掌握以上算法生成圆和直线等图形的基本过程,提高学生对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力。

2.课程设计描述及要求 ●直线中点Bresenham 算法掌握中点Bresenham 算法绘制直线的原理,设计中点Bresenham 算法,编写Mbline()子函数,使用中点Bresenham 算法绘制斜率为0≦k ≦1的直线 ●圆中点Bresenham 算法掌握八分法中点Bresenham 算法绘制圆的原理,设计八分法绘制圆的中点Bresenham 算法,编写八分法绘制圆的CirclePoint(x,y)子函数,编写绘制整圆的Mbcircle()子函数,使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的圆。

此次课程设计的课题为通过编程,实现圆和直线等基本图形的绘制。

要求用Bresenham 算法实现圆和直线等基本图形的绘制,并给出代码和结果截图。

3.系统开发环境 开发工具:VC 6.0操作系统:Microsoft Windows XP 4. 直线的Bresenham 算法原理 4.1中点Bresenham 算法给定直线的两个端点00111P X Y P X Y (,)和(,),可得到直线方程F(x,y)=y-kx-b=0且这时直线将平面分为三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。

计算机图形学,直线,圆,二维变换

计算机图形学,直线,圆,二维变换

实验一、直线的生成实验目的:1、掌握DDA直线画法、中点画线法和Bresenham画线法2、掌握VC++简单程序设计方法实验内容:根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。

实验步骤和方法:首先启动Visual C++ 6.0(注意,其它版本程序无法正确编译),文件(file)→打开工作空间(open workspace)。

打开实验12用基本图形生成\基本图形生成.dsw。

在fileview窗口,source file下,双击直线生成view.cpp,或者classview窗口下,cmyview类下相应的函数,按注释改写下列函数:void CMyView::OnDdaline() (此为DDA生成直线)void CMyView::OnBresenhamline()(此为Bresenham画直线)void CMYView::OnMidPointLine()(此为中点画线法)程序代码说明:1、直线的两个端点,由对话框输入,给定程序已经完成输入代码。

2、SetPixel的用法:COLORREF SetPixel(int x, int y, COLORREF crColor);//x,y为坐标点。

COLORREF SetPixel(POINT point, COLORREF crColor);//point为坐标点。

3、本实验事先提供DDA话直线的函数示范(红色部分是重点,其它部分可以不看)中点画直线函数和BresenHam画直线函数由同学们参照dda直线的示例函数自己完成。

//以下为DDA画直线的源程序float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束//以下为中点画直线的源程序float a,b,d1,d2,d,x,y;a=ya-yb,b=xb-xa,d=2*a+b;d1=2*a,d2=2*(a+b);x=xa,y=ya;pdc->SetPixel(x,y,COLOR);while(x<xb){ if(d<0){x++,y++,d+=d2;}else {x++,d+=d1;}pdc->SetPixel(x,y,COLOR);}//中点画直线结束//以下为Bresenham画直线的源程序int i,s1,s2,interchange;float f,x,y,deltax,deltay,temp; x=xa;y=ya;deltax=abs(xb-xa);deltay=abs(yb-ya);if(xb-xa>=0)s1=1;else s1=-1;if(yb-ya>=0)s2=1;else s2=-1;if(deltay>deltax){ temp=deltax;deltax=deltay;deltay=temp;interchange=1;}else interchange=0;f=2*deltay-deltax;pdc->SetPixel(x,y,COLOR);for(i=1;i<=deltax;i++){ if(f>=0){if(interchange==1) x+=s1;else y+=s2;pdc->SetPixel(x,y,COLOR);f=f-2*deltax;}else {if(interchange==1) y+=s2;else x+=s1;f=f+2*deltay;}}}//Bresenham画直线结束实验二、圆的生成(中点和Bresenham法)实验目的:1、掌握bresenham画圆的算法。

计算机图形学--第三讲 直线与圆生成算法

计算机图形学--第三讲   直线与圆生成算法

12直线生成算法圆弧绘制算法图元的概念33.1 图元的概念为其颜色值。

3.1 图元的概念3.1 图元的概念12直线生成算法圆弧绘制算法图元的概念33.2 直线生成算法曲线和各种复杂的图形均是离散成许多直线段来绘制,因而直线是二维图形生成技术的基础。

数学上的理想直线没有宽度,是由无数个点构成的集合。

对直线进行光栅化时,只能在显示器所给定的有限个像素组成的点阵中,选择能最好地逼近于该直线的一组像素,并对这些像素进行写操作。

这就是通常所说的用显示器绘制直线,即直线的扫描转换。

直线扫描转换的主要工作:快速找出像素点阵中最近的网格点3.2 直线生成算法画一条从近直线的像素序列,并填入色彩数据的过程。

这一过程也称为直线光栅化。

需要解决的问题►连续性►粗细、亮度要均匀►像素逼近待画直线►速度3.2 直线生成算法 问题1问题3.2 直线生成算法常用的直线生成算法有三种:►►►►►►3.2 直线生成算法基本思路:是用数值方法求解微分方程的一种方法,即根据长移动,由此产生连续的像素坐标3.2 直线生成算法设起点和终点坐标分别为Δx令即第3.2 直线生成算法于是有步的结果加上一个增量得到。

该算法在方向增量为3.2 直线生成算法3.2 直线生成算法下图中,用公式(表示,但显示时要用像素来表示,即采用舍入的办法得到最靠近空心圆点的像素,用这些像素(下图中的实心圆点)来表示直线。

3.2 直线生成算法void LineDDA(int{int} }3.2 直线生成算法►►想位置的偏移;►►整运算,运行效率低且取整运算不利于硬件实现基本思路:假定直线斜率P(x p,y的中点,---如果取---如果取---M与问题转换为如何判断构造判别式假设直线方程为:则由数学知识可知有下面的关系:F(F(F(所以,欲判断Q点下方,只需要把中点并检查它的符号。

构造判别式d=F(=a(当d<0取右上方当d≥0取右方P判别式的增量算法当增量为若增量为其它斜率的情况时再将算法设计:画线从d0可以用d0算法设计:例:用中点画线法12345void MidpointLine (int x { int a, b, d} /* mid PointLine */设直线的起点坐标为的情况来说明该算法。

计算机图形学--Bresenham完整算法-画直线、椭圆和圆

计算机图形学--Bresenham完整算法-画直线、椭圆和圆

#include<windows.h>#include<gl/glut.h>#include"stdio.h"int m_PointNumber = 0; //动画时绘制点的数目int m_DrawMode = 1; //绘制模式 1 DDA算法画直线// 2 中点Bresenham算法画直线// 3 改进Bresenham算法画直线// 4 八分法绘制圆// 5 四分法绘制椭圆//绘制坐标线void DrawCordinateLine(void){int i = -250 ;//坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES);for (i=-250;i<=250;i=i+10){glVertex2f((float)(i), -250.0f);glVertex2f((float)(i), 250.0f);glVertex2f(-250.0f, (float)(i));glVertex2f(250.0f, (float)(i));}glEnd();}//绘制一个点,这里用一个正方形表示一个点void putpixel(GLsizei x, GLsizei y){glRectf(10*x,10*y,10*x+10,10*y+10);}/////////////////////////////////////////////////////////////////////DDA画线算法 //// //// //// /////////////////////////////////////////////////////////////////////void DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {//设置颜色glColor3f(1.0f,0.0f,0.0f);//对画线动画进行控制if(num == 1)printf("DDA画线算法:各点坐标\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,xIncre,yIncre;dx = x1-x0;dy = y1-y0;x = x0;y = y0;if(abs(dx) > abs(dy)) epsl = abs(dx);else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; k++){putpixel((int)(x+0.5), (int)(y+0.5));if (k>=num-1) {printf("x=%f , y=%f,取整后 x=%d,y=%d\n", x, y, (int)(x+0.5),(int)(y+0.5));break;}x += xIncre;y += yIncre;if(x >= 25 || y >= 25) break;}}/////////////////////////////////////////////////////////////////////中点Bresenham算法画直线(0<=k<=1) //// //// //// /////////////////////////////////////////////////////////////////////void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("中点Bresenham算法画直线各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei p=0;GLfloat UpIncre,DownIncre,x,y,d,k,dx,dy;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;k=dy/dx;if(k>=0&&k<=1){d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x<=x1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;}}if(k>1){d=dy-2*dx;UpIncre=2*dy-2*dx;DownIncre=-2*dx;while(y<=y1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;y++;if(d<0){x++;d+=UpIncre;}else d+=DownIncre;}}if(k<0&&k>=-1){d=dx-2*dy;UpIncre=-2*dy;DownIncre=-2*dx-2*dy;while(x<=x1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;x++;if(d>0){y--;d+=DownIncre;}else d+=UpIncre;}}if(k<-1){d=-dy-2*dx;UpIncre=-2*dx-2*dy;DownIncre=-2*dx;while(y>=y1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;y--;if(d<0){x++;d+=UpIncre;}else d+=DownIncre;}}}/////////////////////////////////////////////////////////////////////改进的Bresenham算法画直线(0<=k<=1) //// //// x1,y1 终点坐标 //// /////////////////////////////////////////////////////////////////////void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);GLsizei x,y,dx,dy,e,k;if(num == 1)printf("改进的Bresenham算法画直线各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei p=0;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}dx=x1-x0;dy=y1-y0;k=dy/dx;if(k>=0&&k<=1){e=-dx;x=x0;y=y0;while(x<=x1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}if(k>1){e=-dy;x=x0;y=y0;while(y<=y1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;y++;e=e+2*dx;if(e>0){x++;e=e-2*dy;}}}if(k<0&&k>=-1){e=-dx;x=x0;y=y0;while(x<=x1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;x++;e=e+2*dy;if(e<0){y--;e=e+2*dx;}}}if(k<-1){e=-dy;x=x0;y=y0;while(y>=y1){putpixel(x,y);if (p>=num-1) {printf("x=%d,y=%d\n", x, y);break;}p++;y--;e=e-2*dx;if(e<0){x++;e=e-2*dy;}}}}///////////////////////////////////////////////////////////Bresenham算法画圆 //// //// //// ///////////////////////////////////////////////////////////void CirclePoint(GLsizei x,GLsizei y){ putpixel(x,y);putpixel(x,-y);putpixel(y,-x);putpixel(-y,-x);putpixel(-x,-y);putpixel(-x,y);putpixel(-y,x);putpixel(y,x);}void BresenhamCircle(GLsizei x, GLsizei y, GLsizei R, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);GLsizei d;x=0;y=R;d=1-R;if(num == 1)printf("Bresenham算法画圆:各点坐标及判别式的值\n");else if(num==0)return;while(x<=y){CirclePoint(x,y);if (x>=num-1) {printf("x=%d,y=%d,d=%d\n", x, y,d);break;}if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;}}void Bresenham2Circle(GLsizei a,GLsizei b,GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num==1)printf("Bresenham算法画椭圆:各点坐标及判别式的值\n");else if(num==0)return;GLsizei x,y;float d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.5);putpixel(x,y); putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);while(b*b*(x+1)<a*a*(y-0.5)){if (x>=num-1) {printf("x=%d,y=%d,d1=%d\n", x, y,d1);break;}if(d1<=0){d1+=b*b*(2*x+3);x++;}else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}putpixel(x,y); putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);}//while上半部分d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y>0){if (x>=num-1) {printf("x=%d,y=%d,d2=%d\n", x, y,d2);break;}if(d2<=0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}else{d2+=a*a*(-2*y+3);y--;}putpixel(x,y); putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);}}//初始化窗口void Initial(void){// 设置窗口颜色为蓝色glClearColor(0.0f, 0.0f, 1.0f, 1.0f);}// 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;// 设置视区尺寸glViewport(0,0, w, h);// 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();// 建立修剪空间的范围if (w <= h)glOrtho (-250.0f, 250.0f, -250.0f, 250.0f*h/w, 1.0, -1.0);elseglOrtho (-250.0f, 250.0f*w/h, -250.0f, 250.0f, 1.0, -1.0);}// 在窗口中绘制图形void ReDraw(void){//用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);//画出坐标线DrawCordinateLine();switch(m_DrawMode){case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,-20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(0,0,20,m_PointNumber);break;case 5:Bresenham2Circle(10,8,m_PointNumber);default:break;}glFlush();}//设置时间回调函数void TimerFunc(int value){if(m_PointNumber == 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);}//设置键盘回调函数void Keyboard(unsigned char key, int x, int y) {if (key == '1') m_DrawMode = 1;if (key == '2') m_DrawMode = 2;if (key == '3') m_DrawMode = 3;if (key == '4') m_DrawMode = 4;if (key == '5') m_DrawMode = 5;m_PointNumber = 0;glutPostRedisplay();}//void main(void)int main(int argc, char* argv[]){glutInit(&argc, argv);//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,600);glutInitWindowPosition(100,100);glutCreateWindow("基本图元绘制程序);glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize);glutKeyboardFunc(Keyboard);//键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);// 窗口初始化Initial();glutMainLoop(); //启动事件处理循环return 0;}。

计算机图形学划线实验报告

计算机图形学划线实验报告

计算机图形学划线实验报告《计算机图形学》实验报告实验⼀直线、圆(弧)⽣成算法⼀、实验⽬的及要求1. 了解光栅图形显⽰器的⼯作原理和特点;2. 学习C/VC环境下的基本绘图⽅法;3. 实践与巩固直线的基本⽣成算法。

4. 掌握直线扫描转换算法的原理及实现;5. 学习圆(弧)的基本⽣成算法;6. 实践圆(弧)的基本⽣成算法;7. 掌握圆弧扫描转换算法的原理及实现;⼆、理论基础1、有关直线⽣成算法有DDA(数值微分)、中点画线线算法、Bresenham⽣成算法数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。

假设起点的坐标为整数。

让x递增1,y相应递增k。

中点划线算法中若直线在x⽅向增加⼀个单位,y的增量只能在0、1之间。

假设当前像素点已经确定,下⼀像素点就只可能有两种情况,将这两点的中点带⼊直线⽅程中,通过中点在直线的上、下⽅来判断下⼀点的坐标。

Bresenham算法是通过各⾏、各列像素中⼼构造⼀组虚拟⽹络格线,按直线从起点到中点的顺序计算直线与各垂直⽹格线的交点,然后确定该列像素中与此交点最近的像素。

2、有关画圆的算法圆的扫描转换(中点画圆法)、Bresenham画圆算法圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第⼀象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。

之后通过对称画出全部圆。

Bresenham画圆算法考虑圆在第⼀象限上的点,每确定⼀像素,则下⼀像素有三种可能,通过判断右下⽅的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。

三、算法设计与分析1、数值微分法int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|<=1float dx,dy,k,x,y;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x<=x1;x++){pDC->SetPixel(x,int(y+0.5),color);y=y+k;}该程序中每⼀步的x、y值是⽤前⼀步的值加上⼀个增量来获得的。

AutoCAD 2016中文版课件第3章 绘制直线、圆及简单平面图形

AutoCAD 2016中文版课件第3章 绘制直线、圆及简单平面图形

图 3-2 画线段 AB、BC 等
图 3-3 画线段 CF、CJ 等
图 3-4 画闭合线框
3.1 画直线构成的平面图形(1)
3.1.1 画直线 3.1.2 输入点的坐标画线 3.1.3 使用对象捕捉精确画线 3.1.4 实战提高
3.1.1 画直线
使用 LINE 命令可在二维或三维空间中创建直线。发出命令后,用户通过鼠标指定线段 的端点或利用键盘输入端点坐标,AutoCAD 就将这些点连接成直线。LINE 命令可生成单条直 线,也可生成连续折线。不过,由该命令生成的连续折线并非一个单独对象,折线中的每条 直线都是独立的,用户可以对每条直线进行编辑操作。 捉 代号“ FROM” // 捕 捉端 点 A
// 输 入点 B 的 相对 坐 标 // 输 入点 C 的 相对 坐 标 // 输 入点 D 的 相对 坐 标 // 输 入点 E 的 相对 坐 标 // 输 入点 F 的 相对 坐 标 // 使 线框 闭 合
投影视图中显示相交,但实际上并不一定相交),捕捉代号为 APP。
延长线:捕捉延伸点,捕捉代号为 EXT。用户把光标从几何对象端点开始移动,此时系统沿该对象显示出捕捉
辅助线和捕捉点的相对极坐标,如图 3-10 所示,输入捕捉距离后,AutoCAD 定位一个新点。
自:正交偏移捕捉,该捕捉方式可以使用户相对于一个已知点定位另一点,捕捉代号为 FRO。下面的例子说 明了偏移捕捉的用法:在已绘制出的矩形中从点 B 开始画线,点 B 与点 A 的关系如图 3-11 所示。
本节介绍如何输入点的坐标画线和怎样捕捉几何对象上的特殊点等。 【例 3-1】 通过绘制图 3-1 所示的平面图形,来介绍输入点的坐标画线及利用对象捕 捉精确画线的过程。
图 3-1 使用相对坐标及对象捕捉画线

计算机图形学,直线,圆,二维变换

计算机图形学,直线,圆,二维变换

实验一、直线的生成实验目的:1、掌握DDA直线画法、中点画线法和Bresenham画线法2、掌握VC++简单程序设计方法实验内容:根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。

实验步骤和方法:首先启动Visual C++ (注意,其它版本程序无法正确编译),文件(file)→打开工作空间(open workspace)。

打开实验12用基本图形生成\基本图形生成.dsw。

在fileview窗口,source file下,双击直线生成,或者classview 窗口下,cmyview类下相应的函数,按注释改写下列函数:void CMyView::OnDdaline() (此为DDA生成直线)void CMyView::OnBresenhamline()(此为Bresenham画直线)void CMYView::OnMidPointLine()(此为中点画线法)程序代码说明:1、直线的两个端点,由对话框输入,给定程序已经完成输入代码。

2、SetPixel的用法:1、COLORREF SetPixel(int x, int y, COLORREFcrColor);sw2、改写二维变换里的void CMyView::OnMove()函数(需要改写的地方已经做了说明)。

3、生成直线的函数采用VC里的函数。

4、函数的主要任务是计算出平移后的坐标。

程序代码说明:绘制一条直线需要两个函数。

pdc->MoveTo(int x, int y); 将当前点移动至(x ,y)坐标pdc->LineTo(int x, int y); 从当前点绘制一条直线至(x,y)坐标,并将当前点移动至(x,y)。

比如,要绘制一条直线,起点(x0, y0),终点(x1, y1):pdc->MoveTo(x0,y0);pdc->LineTo(x1,y1);1、sw2、改写二维变换里的void CMyView::OnRotate()函数(需要改写的地方我已经做了说明)。

图形学第三章的四个算法(画线&画圆)

图形学第三章的四个算法(画线&画圆)

图形学第三章的四个算法(画线&画圆)Primitives:Those functions in a graphics package that we use to describe the various picture components are called the graphics output primitives, or simply primitives.图元:图形软件包中用来描述各种图形元素的函数称为图形输出原语,或者简称为图元。

Scan-line algorithms for the graphics primitives use the defining coordinate descriptions to determine the locations of pixels that are to be displayed.图元的扫描转换算法使用定义的坐标描述来确定要显示像素的位置。

一、l ine equations直线方程算法,有两种情况,给定σx,和给定σyExample 1:draw a line segment from P1(0,2) to P2(8,14) use line equations ,given σy=2 Answer: slope m=(14-2)/(8-0)=3/2,given σy=2,so σx=σy/m=2/(3/2)=4/3,x k+1=x k+σx=x k+4/3 Process:k 0 1 2 3 4 5 6x k0 4/3 8/3 4 16/3 20/3 8y k 2 4 6 8 10 12 14Rounding x k0 1 4 4 5 7 8So the line position are (1,4),(4,6),(4,8),(5,10),(7,12),(8,14)Example 2:draw a line segment from P1(3,6) to P2(19,13) use line equations ,given σx=2 Answer:slope m=(13-6)/(19-3)=7/16,given σx=2, so σy=m×σy=(7/16)×2=7/8, y k+1=y k+σy=y k+7/8Process:k 0 1 2 3 4 5 6 7 8x k 3 5 7 9 11 13 15 17 19y k 6 55/8 31/4 69/8 19/2 83/8 45/4 97/8 13 Rounding y k 6 7 8 9 9 10 11 12 13So the line position are (3,6),(5,7),(7,8),(9,9),(11,9),(13,10),(15,11),(17,12),(19,13)二、DDA algorithm DDA算法,有两种情况,斜率slope≤1,取σx=1;slope>1,取σy=1,但是在直线方程算法中,σx和σy在题中给定的Example 1:Draw a line segment from P1(0,0) to P2(8,5) use DDA algorithmAnswer:Since slope is less than 1 (m=5/8), sample at unit x intervals (σx=1), and compute y values as y k+1=y k+m=y k+5/8Processing:k 0 1 2 3 4 5 6 7 8x k0 1 2 3 4 5 6 7 8y k0 5/8 10/8 15/8 10/4 25/8 30/8 35/8 5 Rounding y k0 1 1 2 3 3 4 4 5So the pixels of P1(0,0) to P2(8,5) are:(0,0)、(1,1)、(2,1)、(3,2)、(4,3)、(5,3)、(6,4)、(7,4)、(8,5) Example 2:Draw a line segment from P1(0,0) to P2(17,10) use DDA algorithmAnswer:Since slope is greater than 1 (m=10/17), sample at unit y intervals (σy=1), and compute y values as x k+1=x k+1/m=x k+17/10Processing:k 0 1 2 3 4 5 6 7 8 9 10x k0 17/10 17/5 51/10 34/5 17/2 51/5 119/10 68/5 153/117y k0 1 2 3 4 5 6 7 8 9 100 2 3 5 7 8 10 12 14 15 17 Roundingx kSo the pixels of P1(0,0) to P2(17,10) are:(0,0)、(2,1)、(3,2)、(5,3)、(7,4)、(8,5)、(10,6)、(12,7)、(14,8)、(15,9)、(17,10)三、Bresenham algorithm Bresenham 算法,重点考察正斜率<1时,通过计算决策变量p k来决定下一个点是(x k+1,y k) 或(x k+1,y k+1)总结记住p0=2Δy-Δx,然后是>0就加负数<0就加正数If p k < 0,the pixel (x k + 1, y k) and p k+1 = p k + 2Δyelse , the pixel (x k + 1, y k+1) and p k+1 = p k + 2Δy-2ΔxThe first parameter p0=2Δy-ΔxExample: draw a line segment with start point (20,10), endpoint (30,18)Answer: m=0.8 satisfied 0<m<1p0=2Δy-Δx=6;2Δy-2Δx=-4;2Δy=16k p k(x k+1,y k+1)0 6 (21,11)1 6-4=2 (22,12)2 2-4=-2 (23,12)3 -2+16=14 (24,13)4 14-4=10 (25,14)5 10-4=6 (26,15)6 6-4=2 (27,16)7 2-4=-2 (28,16)8 -2+16=14 (29,17)9 14-4=10 (30,18)So the pixels of start point (20,10) to endpoint (30,18) are:(20,10)、(21,11)、(22,12)、(23,12)、(24,13)、(25,14)、(26,15)、(27,16)、(28,16)、(29,17)、(30,18)四、Midpoint Circle Algorithm 中点画圆法,在第一象限y=0到y=x这个八分圆内,通过决策变量确定下一个点是(x k+1,y k)或(x k+1,y k-1)初始坐标(0,0),初始决策变量p0=1-r,若p k<0,下一点为(x k+1,y k),新的决策变量为p k+1 = p k + 2x k+1 +1,若p k>0下一点为(x k+1,y k-1),新的决策变量为p k+1 = p k + 2x k+1 +1−2y k+1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息与计算科学专业基础课ComputerReport Of course 计算机图形学课程实验报告实验题目设计算法绘制直线与圆班级姓名学号指导教师日期实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。

试验地点: 教九楼401 数学系机房实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。

实验内容实验题一实验题目1).用DDA 法在屏幕上画一条具有三个像素宽的直线段L1。

要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。

2).将课堂所讲的斜率0<K<1的中点画线算法推广到斜率K>1、-1<K<0和K<-1的情况,编写一通用的中点画线算法。

实验目的和意义1.了解如何利用C 语言和图形函数进行绘图;2. 熟悉并掌握C 语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 通过对Turbo C 进行图形程序设计的基本方法的学习,能绘制出简单的图形;4. 熟悉并掌握DDA 法在屏幕上画一条具有三个像素宽的直线段L1以及通用的中点画线算法。

通过DDA 法及用的中点画线算法,了解图形系统初始化、图形系统关闭和图设计算法绘制直线与圆实验2形模式的控制,并熟练运用图形坐标的设置,包括定点、读取光标以及图形颜色的设置。

程序制作步骤(包括算法思想、算法流程图等)1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf 、scanf 语句控制线段的端点坐标和画线颜色的自由输入;2. DDAline:设直线之起点为(x1,y1),终点为(x2,y2),则斜率k 为: 则有:⑴.可通过计算由x 方向的增量x ∆引起y 的改变生成直线。

由1i i y y y +=+∆ (i y 为直线上某步的初值)则21121i i i y y y y x y k x x x +-=+∆=+∆- ⑵.也可通过计算由y 方向的增量y ∆引起x 的改变生成直线。

由1i i x x x +=+∆(i x 为直线上某步的初值)则:211211i i i x x x x y x y y y k+-=+∆=+∆- :⑴.假定X 坐标为p x 的各像素点中,与直线最近点已确定为(,)p p x y (用实心小圆表示),那么下一个与直线最近的象素点只能是正右方的1(1,)p p p x y +或右上方2(1,1)p p p x y ++两者之一。

⑵. 再以M 表示P1与P2的中点,即(1,0.5)p p M x y =++又设Q 是理想直线与垂直线1p x x =+的交点 。

显然有:①.当M 在Q 的下方,则P2 离直线 近,应取为下一个象素点;②.当M 在Q 的上方,则P1离直线 近,应取为下一个象素点。

③.当M 和Q 重合,则P 1和P2离直线 一样近,两者均可取为下一个象素点主程序xyx x y y k ∆∆=--=12121+=p x xDDA算法#include ""#include <>#include <>#include <>#include <>DDAline(int x1, int y1, int x2, int y2, int c) {float delta_x = 0;float delta_y = 0;float x = 0;float y = 0;int dx= 0;int dy = 0;int steps = 0;int k = 0;dx=x2-x1;dy=y2-y1;if (abs(dx)>abs(dy)){steps=3*abs(dx);}else{steps=3*abs (dy);}delta_x=(float)dx / (float)steps;delta_y=(float)dy / (float)steps;x=float(x1);y=float(y1);for (k=1; k<=steps;k++){putpixel(int(x+, int(y+, c);x+=delta_x;y+=delta_y;}return 0;}void main(){char t[100] = {0};int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 0;int c = 0;void dda_line(int x1,int y1,int x2,int y2,int c);int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,"D:\\TC"); /*初始化图形系统*/printf("输入两端点坐标:\n");scanf("<%d,%d>,<%d,%d>",&x1,&y1,&x2,&y2);printf("输入画线颜色:\n");scanf("%d",&c);DDAline(x1,y1,x2,y2,c);sprintf(t,"(%d,%d)",x1,y1);outtextxy(x1,y1,t);sprintf(t,"(%d,%d)",x2,y2);outtextxy(x2,y2,t);getch(); /*等待按一键结束*/closegraph(); /*关闭图形系统,回到文本模式*/ }中点画线算法#include <>#include <>#include <>#include <>#include ""MidpointLine(int x1,int y1,int x2,int y2,int c){int a = 0;int b = 0;int d1 = 0;int d2 = 0;int d = 0;int x = 0;int y = 0;float m = 0;if (x2<x1){d=x1;x1=x2;x2=d;d=y1;y1=y2;y2=d;}a=y1-y2;b=x2-x1;if (b==0){m=-1*a*100;}else{m=(a/(x1-x2)); }x=x1;y=y1;putpixel(x,y,c);if (m>=0 && m<=1){d=2*a+b;d1=2*a;d2=2*(a+b);while (x<x2){if (d<=0){x++;y++;d+=d2;}else{x++;d+=d1;}putpixel(x,y,c);}}else if (m<=0 && m>=-1){d=2*a-b;d1=2*a-2*b;d2=2*a;while (x<x2){if (d>0){x++;y--;d+=d1;}else{x++;d+=d2;}putpixel(x,y,c);}}else if (m>1){d=a+2*b;d1=2*(a+b);d2=2*b;while (y<y1){if (d>0){x++;y++;d+=d1;}else{y++;d+=d2;}putpixel(x,y,c);}}else{d=a-2*b;d1=-2*b;d2=2*(a-b);while (y>y1){if (d<=0){x++;y--;d+=d2;}else{y--;d+=d1;}putpixel(x,y,c);}}return 0;}void main(){char t[100] = {0};int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 0;int c = 0;int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,"D:\\TC"); /*初始化图形系统*/printf("输入两端点坐标:\n");scanf("<%d,%d>,<%d,%d>",&x1,&y1,&x2,&y2);printf("输入画线颜色:\n");scanf("%d",&c);MidpointLine(x1,y1,x2,y2,c);sprintf(t,"(%d,%d)",x1,y1);outtextxy(x1,y1,t);sprintf(t,"(%d,%d)",x2,y2);outtextxy(x2,y2,t);getch(); /*等待按一键结束*/closegraph(); /*关闭图形系统,回到文本模式*/ }运行结果图DDA算法图算法运行结果截图图算法运行结果截图中点画线算法图中点画线算法当k<=1时运行结果截图图中点画线算法当k<=1时运行结果截图图中点画线算法当0<k<1时运行结果截图图中点画线算法当0<k<1时运行结果截图图中点画线算法当k=-1时运行结果截图图中点画线算法当k=-1时运行结果截图图中点画线算法当-1<k<0时运行结果截图图中点画线算法当-1<k<0时运行结果截图图中点画线算法当k<-1时运行结果截图实验题二实验题目1).参考课堂所讲过的斜率为0~1和大于1的Bresenham画线程序,将该算法程序扩展到任一八分圆坐标空间图,从而形成一般的Bresenham画线算法。

并利用Bresenham画线算法画出4条不同颜色、不同斜率的直线段L1、L2、L3、L4。

要求:(1)4条直线段L1、L2、L3、L4的斜率K1、K2、K3、K4满足:0<K1<1,-1<K2<0, K3<-1,K4>1;(2)直线段的两个端点坐标和画线颜色都要求可以随机输入。

相关文档
最新文档