上机实验2:绘制直线与圆.doc_第1页
上机实验2:绘制直线与圆.doc_第2页
上机实验2:绘制直线与圆.doc_第3页
上机实验2:绘制直线与圆.doc_第4页
上机实验2:绘制直线与圆.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Computer Graphics Report Of course experiment 信息与计算科学专业基础课计算机图形学课程实验 报 告实验题目 设计算法绘制直线与圆 班 级 计算091 姓 名 王姣 学 号 3090811002 指导教师 胡钢 日 期 2012-4-20 西安理工大学理学院应用数学系二零零八年春季学期实验2设计算法绘制直线与圆实验说明试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。试验地点: 教九楼401 数学系机房实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC或C+,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。实验内容:实验题一1.1实验题目1).用DDA法在屏幕上画一条具有三个像素宽的直线段L1。要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。2).将课堂所讲的斜率0K1、-1K0和Kabs(dy) steps=3*abs(dx);else steps=3*abs (dy);delta_x=(float)dx / (float)steps;delta_y=(float)dy / (float)steps;x=x1;y=y1;for (k=1; k=steps;k+) putpixel(int(x+0.5), int(y+0.5), c); x+=delta_x; y+=delta_y;return 0;void main() char t100; int x1,int y1,int x2,int y2,int c; 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 graphics.h#include stdlib.h#include stdio.h#include conio.h#include math.hMidpointLine(int x1,int y1,int x2,int y2,int c)int a,b,d1,d2,d,x,y;float m;if (x2=0 & m=1)d=2*a+b;d1=2*a,d2=2*(a+b);while (xx2)if (d=0)x+,y+,d+=d2;elsex+,d+=d1;putpixel(x,y,c);else if (m=-1)d=2*a-b;d1=2*a-2*b,d2=2*a;while (x0)x+,y-,d+=d1;elsex+,d+=d2;putpixel(x,y,c);else if (m1)d=a+2*b;d1=2*(a+b),d2=2*b;while (y0)x+,y+,d+=d1;elsey+,d+=d2;putpixel(x,y,c);elsed=a-2*b;d1=-2*b,d2=2*(a-b);while (yy1)if (d=0)x+,y-,d+=d2;elsey-,d+=d1;putpixel(x,y,c);return 0;void main()char t100;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);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(); /*关闭图形系统,回到文本模式*/1.5运行结果图DDA法画直线:中点画线算法:0k1:K-1:-1k0:实验题二2.1实验题目1).参考课堂所讲过的斜率为01和大于1的Bresenham画线程序,将该算法程序扩展到任一八分圆坐标空间图,从而形成一般的Bresenham画线算法。并利用Bresenham画线算法画出4条不同颜色、不同斜率的直线段L1、L2、L3、L4。要求:(1)4条直线段L1、L2、L3、L4的斜率K1、K2、K3、K4满足:0K11,-1K20, K31;(2)直线段的两个端点坐标和画线颜色都要求可以随机输入。2).参考课堂所讲过的圆心在原点,半径为R的第一个4分圆的Bresenham画圆算法程序,利用对称性将该算法程序推广到任一四分圆,从而形成一般的Bresenham画圆算法。并利用该算法画出一个圆心在点(xc, yc),半径为R,圆周颜色为color的圆。要求:(1)圆心的坐标、半径和圆周颜色都要求可以随机输入;(2)要求利用文本输出函数显示出所画圆的圆心和半径;(3)利用四向简单种子填充算法填充该圆。2.2实验目的和意义1.熟悉并掌握各种斜率的Bresenham画线程序2. 熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 熟悉并掌握Bresenham画圆算法画一个完整的圆并进行填充。2.3程序制作步骤(包括算法思想、算法流程图等)这个算法的流程图如下:Bresenham画圆算法的流程图如下。2.4主程序#includegraphics.h#include#includeswap(int *a,int *b)int tmp;tmp=*a;*a=*b;*b=tmp;int zhixian(int x1,int y1,int x2,int y2,int color)double dx,dy,h,x,y,t;if(x1x2)swap(&x1,&x2);swap(&y1,&y2);dx=x2-x1;dy=y2-y1;x=x1;y=y1;putpixel(x,y,color);if(dx=0) while(y!=y2) putpixel(x,y,color);y+;if(dy=0)while(x!=x2)putpixel(x,y,color);x+;if(dy!=0&dx!=0)if(dy0)if(dy=dx)h=2*dy-dx;while(x!=x2)if(h0)h+=2*dy;elsey+;h+=2*(dy-dx);putpixel(x,y,color);x+;elseh=2*dx-dy;while(y!=y2)if(h0)h+=2*dx;else +x;h+=2*(dx-dy);putpixel(x,y,color);y+;elset=-dy;if(t=dx) h=2*dy+dx;while(x!=x2)if(h0)h+=2*(dy+dx);y-;elseh+=2*dy;putpixel(x,y,color);x+;elseh=-(2*dx*dy)-(dy*dy);while(y!=y2)if(h=0) putpixel(a+x,b+y,color); putpixel(a-x,b+y,color); putpixel(a+x,b-y,color); putpixel(a-x,b-y,color); if(delta0) delta1=2*(delta+y)-1; if(delta10) delta2=2*(delta-x)-1; if(delta21:0k1:K-1:-1K0:Bresenham画圆:实验题三3.1实验题目自学椭圆的Bresenham生成算法,利用对称性将该算法程序推广到任一四分圆,从而形成一般的Bresenham画椭圆算法。并上机编程画出一个圆心在点(xc, yc);沿x轴方向的长半轴长度为a, 沿y轴方向的短半轴长度为b; 圆周颜色为color的椭圆。要求:(1)椭圆心的坐标、长半轴长度为a、短半轴长度为b和圆周颜色color都要求可以随机输入;(2)要求利用文本输出函数显示出所画椭圆的圆心。3.2实验目的和意义1. 自学椭圆的Bresenham生成算法2. 利用对称性将该算法程序推广到任一四分圆,编写一般的Bresenham画椭圆算法3.熟悉并掌握椭圆弧的画法,并拓展到整个8分椭圆。3.3程序制作步骤(包括算法思想、算法流程图等)算法步骤:1. 输入椭圆的长半轴a和短半轴b。2. 计算初始值d = b*b + a * a * (-b + 0.25), x = 0, y = b。3. 绘制点 (x, y)及其在四分象限上的另外3个对称点。4. 判断d的符号。若d = 0,则先将d更新为d + b * b * (2 * x + 3),再将 (x, y)更新为(x+1, y);否则先将d更新为d + b * b * (2 * x + 3) + a * a (-2 * y + 2),再将(x, y)更新为(x+1, y-1)。5. 当b*b * (x+1) a * a * (y - 0.5)时,重复步骤(3)和(4),否则转到步骤(6)。6. 用上半部分计算的最后点(x, y)来计算下半部分中d的初值: d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b。7. 绘制点(x, y)及其在四分象限上的另外3个对称点。8. 判断d的符号。若d = 0, 重复步骤(7)和(8),否则结束。3.4主程序 #include graphics.h#include stdio.h#include conio.hvoid Bresenham_Ciecle(int a,int b,int p,int q,int c) putpixel(p,q,c);int x=0;int y=b;double dt=b*b+a*a*(-b+0.25);putpixel(x+p,y+q,c);while(b*b*(x+1)a*a*(y-0.5)if(dt0)if(dbb):n); scanf(%d %d,&a,&b); printf(请输入椭圆的圆心坐标:n); scanf(%d %d,&x,&y); printf(请输入椭圆的颜色:); scanf(%d,&c); initgraph(&gdriver,&gmode,); Bresenham_Ciecle(a,b,x,y,c); sprintf(m,(%d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论