计算机图形上机作业.docx
- 文档编号:2476539
- 上传时间:2022-10-30
- 格式:DOCX
- 页数:30
- 大小:215.25KB
计算机图形上机作业.docx
《计算机图形上机作业.docx》由会员分享,可在线阅读,更多相关《计算机图形上机作业.docx(30页珍藏版)》请在冰豆网上搜索。
计算机图形上机作业
计算机图形上机作业
实验一开发环境的使用及直线的生成
实验目的:
直线的生成是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机生成直线。
熟悉开发环境,生成直线。
实验要求:
(1)熟悉TurboC开发环境
(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算法的讨论有:
(1)
(2)
在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,不利于计算。
为此,我们构造一个新的判别式:
(3)
其中,,当时,和同号。
以i+1代入式
(2)中的i,得:
(4)
(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;ifPi>0则yi+1=yi+1;否则yi+1=yi;
3.画点(xi+1,yi+1);
4.求下一个误差Pi+1;ifPi>0则Pi+1=Pi+2dy-2dx;否则Pi+1=Pi+2dy;
5.然后根据Pi+1的符号,再求yi+2的坐标,依次类推,直到到达终点(x2,y2)。
实验步骤:
1.打开TurboC编程环境。
2.编程实现DDA算法和Bresenham算法画直线。
3.算法示例:
(1)DDA算法画直线:
#include"stdio.h"
#include"conio.h"
#include"graphics.h"
#defineround(x)((int)((x>=0)?
(x+0.5):
(x-0.5)));
voidsetpixel(intx,inty)
{
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(intx1,inty1,intx2,inty2)
{
floatx=1+3*x1,y=1+3*y1;
intz;
floatk;
if(x1==x2)
{
if(y2>=y1)
{
for(;y<=1+3*y2;y=y+3)
setpixel(x,y);
}
else
{
for(;y>=1+y2*3;y=y-3)
setpixel(x,y);
}
}
else
{
k=(float)(y2-y1)/(x2-x1);
if(k<=1&&k>=-1&&x2>=x1)
{
z=1+y1*3;
for(;x<=1+x2*3;x=x+3)
{
setpixel(x,z);
y=y+3*k;
z=round(y);
}
}
if(k<=1&&k>=-1&&x2 { z=1+y1*3; for(;x>=1+x2*3;x=x-3) { setpixel(x,z); y=y-3*k; z=round(y); } } if(k>1&&y2>=y1) { z=1+x1*3; for(;y<=1+y2*3;y=y+3) { setpixel(z,y); x=x+3/k; z=round(x); } } if(k>1&&y2 { z=1+x1*3; for(;y>1+y2*3;y=y-3) { setpixel(z,y); x=x-3/k; z=round(x); } } if(k<-1&&y2>=y1) { z=1+x1*3; for(;y<=1+y2*3;y=y+3) { setpixel(z,y); x=x+3/k; z=round(x); } } if(k<-1&&y2 { z=1+x1*3; for(;y>=1+y2*3;y=y-3) { setpixel(z,y); x=x-3/k; z=round(x); } } } } voidmain() { intDriver=VGA; intDmode=VGAHI; intx1,y1,x2,y2; intgdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph(&Driver,&Dmode,"G: \\TC\\Project"); printf("inputthestartpoint: \n"); printf("x1="); scanf("%d",&x1); printf("y1="); scanf("%d",&y1); printf("inputtheendpoint: \n"); printf("x2="); scanf("%d",&x2); printf("y2="); scanf("%d",&y2); DDAline(x1,y1,x2,y2); getch(); } (2)Bresenham算法画直线: #include #include #include #include voidswap(int*m,int*n) { intt; t=*m; *m=*n; *n=t; } voidbresenhamline(intx0,inty0,intx1,inty1,intcolor) { intx,y,dx,dy,p,same,change; if(x0==x1) { if(y0>y1) swap(&y0,&y1); x=x0,y=y0; for(;y putpixel(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; else { p+=change; y++; } } return; } elseif(-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; else { p+=change; y--; } } return; } elseif(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; else { p+=change; x++; } } return; } else { if(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; else { p+=change; x--; } } return; } } main() { intDriver=VGA; intDmode=VGAHI; intx0,y0,x1,y1; intgdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph(&Driver,&Dmode,"G: \\TC\\Project"); printf("inputthestartpoint: \n"); printf("x0="); scanf("%d",&x0); printf("y0="); scanf("%d",&y0); printf("inputtheendpoint: \n"); printf("x1="); sc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形 上机 作业