实验一开发环境的使用及直线的生成。
实验目的:直线的生成是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机生成直线。熟悉开发环境,生成直线。
实验要求:(1)熟悉turbo c开发环境。
2)分别用dda算法、bresenham算法生成直线。
实验原理:一、 直线的dda算法。
设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得:
1)设第i个坐标点为,可通过计算由x方向的增量△x引起y的改变来生成直线,当x方向的步进值为1时,则,选取最接近的像素点作为直线的下一个坐标。
2)也可通过计算由y方向的增量△y引起x的改变来生成直线。
当y方向的步进值为1时,则,选取最接近的坐标点作为直线的下一个坐标。
以此类推,直到达到终点(x2,y2)为止,从而利用dda算法实现线段的绘制。
二、 bresenham算法画直线:
设直线从起点(x1, y1)到终点(x2, y2),设直线方程为:y=kx+b
其中b = y1 - k * x1,
根据dda算法的讨论有:
在1a象限里,即且,时,当直线光栅化时,x每次都增加1个单元:,y每次都增加k,由于k不一定是整数,因此由(2)式求出的y也不一定是整数。所以要用最靠近y的整数来代替y,假设直线上第i个像素坐标为(xi,yi),那么,它的下一个点的像素点的可能位置为(xi+1,yi)或(xi+1,yi+1)。
如图1所示:
图1 直线和像素坐标位置关系。
如上图在x=xi+1处,直线上y的值y=k(xi+1)+b,该点距离点(xi+1,yi)和点(xi+1,yi+1)的距离分别为d1和d2,其中。
a. 当d1-d2>0时,说明直线上的理论点距离(xi+1,yi+1) 较近,因此下一个直线像素点应取(xi+1,yi+1)。
b. 当d1-d2<0时,说明直线上的理论点距离(xi+1,yi)较近,因此下一个直线像素点应取(xi+1,yi)。
c. 当d1-d2=0时,说明直线上的理论点距离上、下两个像素点的距离相等,因此规定取(xi+1,yi+1)作为下一个直线像素点。
因此,利用(d1-d2)的符号就可以决定下一个像素点的选择。
然而含有变量xi、yi,不利于计算。为此,我们构造一个新的判别式:
其中,,当时,和同号。
以i+1代入式(2)中的i,得:
4)-(3)可得: 所以:
当时,, 当时,, 其中。
同理可得直线斜率在其他范围时的递推关系式!
第1a象限内的直线bresenham算法思想如下:
假设线段起点为(x1, y1),终点为(x2,y2)
1.画点(x1, y1); dx=x2-x1; dy=y2-y1;计算误差初值p1=2dy-dx; i=1;
2.求直线的下一点位置:xi+1=xi+1;if pi>0 则yi+1=yi+1;否则yi+1=yi;
3.画点(xi+1, yi+1);
4.求下一个误差pi+1;if pi>0 则pi+1=pi+2dy-2dx;否则pi+1=pi+2dy;
5.然后根据pi+1的符号,再求yi+2的坐标,依次类推,直到到达终点(x2,y2)。
实验步骤:1. 打开turbo c编程环境。
2. 编程实现dda算法和bresenham算法画直线。
3. 算法示例:
1) dda算法画直线:
#include ""
#include ""
#include ""
#define round(x) (int)((x>=0)?(x+0.5):(x-0.5)))
void setpixel(int x,int y)
putpixel(x,y,4);
putpixel(x,y+1,4);
putpixel(x,y-1,4);
putpixel(x-1,y,4);
putpixel(x-1,y+1,4);
putpixel(x-1,y-1,4);
putpixel(x+1,y,4);
putpixel(x+1,y-1,4);
putpixel(x+1,y+1,4);
ddaline(int x1,int y1,int x2,int y2)
float x=1+3*x1,y=1+3*y1;
int z;
float k;
if(x1==x2)else
elseif(k<=1&&k>=-1&&x2
if(k>1&&y2>=y1)
if(k>1&&y2
if(k<-1&&y2>=y1)
if(k<-1&&y2
void main()
int driver=vga;
int dmode=vgahi;
int x1,y1,x2,y2;
int gdriver=detect,gmode;
registerbgidriver(eg**ga_driver);
initgraph(&driver,&dmode,"g:\\tc\\project");
printf("input the start point:");
printf("x1=")
scanf("%d",&x1);
printf("y1=")
scanf("%d",&y1);
printf("input the end point:");
printf("x2=")
scanf("%d",&x2);
printf("y2=")
scanf("%d",&y2);
ddaline(x1,y1,x2,y2);
getch();
2) bresenham算法画直线:
#include <>
#include <>
#include<>
#include<>
void swap(int* m,int* n)
int t;
t=*m;m=*n;
n=t;void bresenhamline(int x0,int y0,int x1,int y1,int color)
int x,y,dx,dy,p,same,change;
if(x0==x1)
if(y0>y1)
swap(&y0,&y1);
x=x0,y=y0;
for(;yputpixel(x,y,color);
return;
if(x0>x1)
swap(&x0,&x1);
swap(&y0,&y1);
dx=x1-x0;
dy=y1-y0;
if(0<=dy&&dy<=dx)
p=dy<<1-dx,same=dy<<1,change=(dy-dx)<<1,x=x0,y=y0;
for(;x{
putpixel(x,y,color);
if(p<0)
p+=same;
elsep+=change;
y++;return;
else if(-dx<=dy&&dy<0)
p=-dx-dy<<1,same=-dy<<1,change=(-dy-dx)<<1,x=x0,y=y0;
for(;x{
putpixel(x,y,color);
if(p<0)
p+=same;
elsep+=change;
y--;return;
else if(dx{
if(y0>y1)
swap(&x0,&x1);
swap(&y0,&y1);
dx=x1-x0;
dy=y1-y0;
p=dx<<1-dy,same=dx<<1,change=(dx-dy)<<1,x=x0,y=y0;
for(;y{
putpixel(x,y,color);
if(p<0)
p+=same;
elsep+=change;
x++;return;
elseif(y0>y1)
swap(&x0,&x1);
swap(&y0,&y1);
dx=x1-x0;
dy=y1-y0;
p=-dx*2-dy,same=-dx*2,change=-(dx+dy)*2,x=x0,y=y0;
for(;y{
putpixel(x,y,color);
if(p<0)
p+=same;
elsep+=change;
x--;return;
main()
int driver=vga;
int dmode=vgahi;
int x0,y0,x1,y1;
计算机图形作业
第1章概述。1 一个计算机系统监视进入停车场的每一辆汽车,将其车牌号及车身颜色与数据库中记录对比以确定是否准入。请说明该系统在哪些方面使用计算机图形学 图像处理和模式识别技术。2 举例说明计算机图形学 图像处理和模式识别三个学科分支之间的主要区别及相互渗透。3.你认为学好计算机图形学需要哪些基础知识...
计算机图形作业
计算机图形作业。txt用快乐去奔跑,用心去倾听,用思维去发展,用努力去奋斗,用目标去衡量,用爱去生活。钱多钱少,常有就好!人老人少,健康就好!家贫家富,和睦就好。第1章概述。1 一个计算机系统监视进入停车场的每一辆汽车,将其车牌号及车身颜色与数据库中记录对比以确定是否准入。请说明该系统在哪些方面使用...
计算机上机作业
三 上机操作题第一部份2页 1 现有一个名为888的拨号连接,要求配置如下属性 号码从163改为8888,如果忙音重拨100次,每次间隔30秒,断线不重拨,使用windowsxp的防火墙。开始 设置 网络 选常规选项卡 号码 8888 选项选项卡 重拨次数 100 重拨间隔 30秒 去掉勾选 断线重...