计算机图形学课程设计----课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学课程设计
学院:计算机科学学院
班级:
学号:
学生姓名:
指导教师:
2008年1月
设计一
一、课题说明
用所学算法编写实现图形比例,移动,旋转变换的程序
二、概要设计
比例变换矩阵:
移动变换矩阵:
旋转变换矩阵:
由于在640*480默认的显示模式下,原点(0,0)坐标在屏幕的左上角,左上角向右下角走,x 值增大,左上角向右上角走,y 值增大。
为了便于显示与理解,把原点定在(320,240)点。
则移动变换与旋转变换的矩阵就会改变。
旋转变换后,x 坐标变为:320+(x-320)*cos(a)-(240-y)*sin(a); y 坐标变为:240-(x-320)*sin(a)-(240-y)*cos(a)
本程序通过一个三角形比例,移动,旋转变换演示比例,移动,旋转后的结果。
首先画出需要变换的三角形(通过给出三角形的三个顶点画出三角形),对三个三角形的顶点变换实现比例,移动,旋转变换操作。
三、源程序及注释
#include <stdio.h>
#include <graphics.h>/*加入c 图形库*/ #include <math.h>
yidong(int dx,int dy)/*实现移动函数*/
{
moveto(320+dx,240-dy);
lineto(420+dx,120-dy);
lineto(450+dx,140-dy);
lineto(320+dx,240-dy);/*变换三角形三个点的坐标实现移动变换*/
}
bilie(float Sx,float Sy) /*实现比例函数*/
{
moveto(320*Sx,240*Sy);
lineto(420*Sx,120*Sy);
lineto(450*Sx,140*Sy);
lineto(320*Sx,240*Sy); /*变换三角形三个点的坐标实现比列变换*/
}
xuanzhuan(float a) /*实现旋转函数*/
{
float p;
moveto(320,240);
lineto(320+(420-320)*cos(a)-(240-120)*sin(a),240-(420-320)*sin(a)-(240-120)*cos(a));
lineto(320+(450-320)*cos(a)-(240-140)*sin(a),240-(450-320)*sin(a)-(240-140)*cos(a));
lineto(320,240); /*变换三角形三个点的坐标实现旋转变换*/
}
main()
{
int i,j;
float X,Y,bx,by,a;
int gdriver=DETECT,gmode; /*初始化显示模式参数*/
initgraph(&gdriver,&gmode,""); /*初始化显示为默认的640*480、16色模式*/
i=20;
j=240;
moveto(i,j);
for(i=20;i<=620;i+=20) /*使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240);
i=320;
j=20;
moveto(i,j);
for(j=20;j<=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j);
moveto(320,240);
lineto(420,120);
lineto(450,140);
lineto(320,240);/*画出需变换的三角形,其三个顶点分别为(320,240);
(420,120) ;(450,140)*/
printf("please input X,Y to move:");
scanf("%f%f",&X,&Y); /*输入移动量*/
yidong(X,Y);
printf("please input bx,by to scale:");
scanf("%f%f",&bx,&by); /*输入x方向,y方向缩放大小*/
bilie(bx,by);
printf("please input a to circumgyrate:");
scanf("%f",&a); /*输入旋转角度,a为正,则逆时针旋转*/
xuanzhuan(a);
}
四、运行结果
移动(40,40)
后的三角形
原
始
三
角
形
旋转45o后的三角
x轴方向上缩小0.5倍后的三角形
设计二
一、课题说明
编写一个AutoLISP程序,其功能是:画一个轴衬的两个视图,如图4所示。
程序应提示用户输入衬套的起始点P0、长度L1、L2和直径ID、OD、HD。
主视图与侧视图间的距离DIS为DIS=1.25*HD。
程序应分别在HID层和CEN层画出虚线和中心线。
中心线需延伸出对象线0.75个单位。
图4 轴衬的两个视图
二、概要设计
轴衬的两个视图可通过画线函数lineto()、画虚线xuxian()函数(自定义)、画圆函数Bres_Circle()(自定义函数)、画虚圆函数Bres_Circle1()(自定义)实现。
1、虚线函数xuxian()通过隔一段距离画一条直线实现
2、画圆函数Bres_Circle()使用Bresenham画圆算法
3、画虚圆算法Bres_Circle1()中通过在Bresenham画圆时省去部分点来实现画虚圆
三、源程序及注释
#include <stdio.h>
#include <graphics.h>/*加入c图形库*/
#include <math.h>
int xuxian(int x,int y,int endx)/*实现画虚线函数*/
{
while(x<=endx){
moveto(x,y);
x+=8;
lineto(x,y);
x+=5;
}
lineto(endx,y);
return(0);
}
int zhxinxian(int x0,int y0, int endx)/*实现画点划线函数*/
{
moveto(x0-30,y0);
x0+=40;
lineto(x0,y0);
while(x0<=endx)
{
x0+=8;
moveto(x0,y0);
x0+=8;
lineto(x0,y0);
x0+=8;
moveto(x0,y0);
x0+=80;
lineto(x0,y0);
}
lineto(endx,y0);
return(0);
}
int Bres_Circle(int x0,int y0,double r,int color) /*Bresenham画圆函数*/
{
int x,y,d;
x=0;
y=(int)r;
d=(int)(3-2*r);/*递推公式初始值*/
while(x<y)
{
CirPot(x0,y0,x,y,color);
if(d<0)
d+=4*x+6; /*递推公式d<0,迭代d=d+4*x+6*/
else
{
d+=4*(x-y)+10; /*递推公式d>=0,迭代d=d+4*(x-y)+10*/
y--;
}
x++;
}
if(x==y)
CirPot(x0,y0,x,y,color);
return(0);
}
int Bres_Circle1(int x0,int y0,double r,int color) /*实现画虚圆函数*/ {
int x,y,d,i,j,iTag;
j=0;
i=0;
x=0;
y=(int)r;
d=(int)(3-2*r);
while(x<y)
{
j++;
if(i==0)
iTag=0;
if(iTag==0){
CirPot(x0,y0,x,y,color);
i++;
}
if(i==5){iTag=1;}
if(iTag==1){i--;}
if(d<0)
d+=4*x+6;
else
{
d+=4*(x-y)+10;
y--;
}
x++;
}
if(x==y)
CirPot(x0,y0,x,y,color);
printf("j=%d",j);
}
int CirPot(int x0,int y0,int x,int y,int color)
{
int oldcolor;
putpixel((x0+x),(y0+y),color);
putpixel((x0+y),(y0+x),color);
putpixel((x0+y),(y0-x),color);
putpixel((x0+x),(y0-y),color);
putpixel((x0-x),(y0-y),color);
putpixel((x0-y),(y0-x),color);
putpixel((x0-y),(y0+x),color);
putpixel((x0-x),(y0+y),color);
return(0);
}
main()
{
int p0,L1,L2,ID,OD,HD;
int gdriver=DETECT,gmode; /*初始化显示模式参数*/
int color=15;
initgraph(&gdriver,&gmode,""); /*初始化显示为默认的640*480、16色模式*/ printf("please input (L1,L2)(as(L1=150,L2=30)):");
scanf("%d%d",&L1,&L2);
printf("please input (ID,OD,HD)(as(ID=80,OD=150,HD=200)):");
scanf("%d%d%d",&ID,&OD,&HD);
moveto(100,240);/*o*/
lineto(100,240+OD/2);/*a*/
lineto(100+L1-L2,240+OD/2);/*b*/
lineto(100+L1-L2,240+OD/2+(HD-OD));/*c*/
lineto(100+L1,240+OD/2+(HD-OD));/*d*/
lineto(100+L1,240-OD/2-(HD-OD));/*e*/
lineto(100+L1-L2,240-OD/2-(HD-OD));/*f*/
lineto(100+L1-L2,240-OD/2);/*g*/
lineto(100,240-OD/2);/*f*/
lineto(100,240);/*0*/
xuxian(100,240+ID/2,100+L1);
xuxian(100,240-ID/2,100+L1);
zhxinxian(100,240,100+L1);
Bres_Circle(100+L1+1.25*HD,240,ID/2, color);
Bres_Circle(100+L1+1.25*HD,240,HD/2, color);
Bres_Circle1(100+L1+1.25*HD,240,OD/2, color);
zhxinxian(100+L1+1.25*HD-HD/2,240,100+L1+1.25*HD+HD/2);
}
四、运行结果
输入的ID、OD、HD L1、L2分别为80,150,200,150,30时,运行结果如下:
设计三
一、课题说明
编写一个L I S P 程序,其功能是绘制如图5所示的梯子。
程序在运行时应该提示用户输入梯子的高度(Rise )、宽度(Run)和梯子的阶数n 。
还需要输入平台的长度L 。
二、概要设计
通过调用C 语言中的库函数lineto ()实现画线功能,首先调用moveto ()函数起始点移至点A 。
根据用户输入的的Run 和Rise 的大小,画出直线AB 和直线BC (调用line (x A +Run,y A )与line (x B +Run,y B )实现画AB 直线和BC 直线),以此类推,画出如图1的梯子。
三、源程序及注释
#include <stdio.h>
#include <graphics.h>/*加入c 图形库*/ #include <math.h> main() {
int gdriver=DETECT,gmode; /*初始化显示模式参数*/ float Rise,Run,L; int n,i;
initgraph(&gdriver,&gmode,""); /*初始化显示为默认的640*480、16色模式 */ printf("input Rise:"); scanf("%f",&Rise); printf("input Run:"); scanf("%f",&Run); printf("input L:"); scanf("%f",&L); printf("input n:");
scanf("%d",&n); /*实现输入高度(Rise )、宽度(Run)、梯子的阶数n 与平台的长度L */ moveto(100,240);/*移至初始点A (100,240)*/
A
B
C
D
E
F
图 1 梯子
G
H
I
for(i=1;i<=n-1;i++){
lineto(100+i*Run,240-(i-1)*Rise);
lineto(100+i*Run,240-i*Rise);
} /*for循环实现画出ABCDEF线段*/
lineto(100+(i)*Run,240-(i-1)*Rise); /*画出FG线段*/ ineto(100+(i)*Run,240+Rise); /*画出线段GH线段*/ lineto(100,240+Rise); /*画出线段HI线段*/
lineto(100,240); /*画出线段IA线段*/
}
四、运行结果
新得体会
通过本次课程设计,我了解到自己还有很多不足,对面向对象语言C++不能熟悉的去运用,而进行图形开发,C++语言是很实用的。
本次课程设计运用C语言实现。
有很多方面不足,程序比较粗糙,简陋,不具有交换性。
若要在图形学方面进一步学习的话,掌握C++面向对象的编程思想进行图形开发是很有必要的。
运用C++容易实现交换性,开发出的图形界面友好。
在本次课程设计开始初,本是想用C++开发的,但是要运用到MFC模式,编写代码使用这种模式运行试了好久,运行不出结果,最终放弃了运用C++开发,转向了使用C开发。
总之,自己的能力还亟待提高,学的还很肤浅,以后需更加努力。