cadcam实验报告

实 实验课程:学生姓名:学 号:专业班级:

验 报 告

计算机辅助设计与制造 钱志伟 5901108126

机制083班

20xx年12月 30日

- 0 -

cadcam实验报告

cadcam实验报告

目 录

一、 实验一 二维图形复合变换编程

二、 实验二 三次贝赛尔曲线生成 三、 实验三 三次B样条曲线生成 - 1 -

南昌大学实验报告

学生姓名: 学 号: 专业班级: 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:

实验一 二维图形复合变换编程

一、实验目的:

1.掌握CAD图形处理的原理和方法。

2.理解CAD对图形进行复合变换的过程。

二、实验要求

在二维模式下,将三角形绕任意点旋转θ角。三角形三点的坐标、旋转点坐标和旋转角度可由用户任意输入。原图形和变换后的图形必须同时显示在显示器上。

三、实验设备

1.计算机系统

2.安装Turbo C或其他C语言集成开发工具

四、实验原理

1、变换原理

基本旋转矩阵是相对坐标原点的,为了满足这一要求,必须先将旋转点和需要处理的图形向原点平移,使旋转点与原点重合,然后对图形进行旋转变换。旋转变换后,再将旋转点和旋转后的图形平移到旋转点。基本变换矩阵如下:

根据上述图形变换原理,对二维图形绕任意点(旋转点)旋转的复合变换矩平移T= 1 0 0 0 1 0 l m 1 旋转T= cosθ sinθ 0 -sinθ cosθ 0 0 0 1

- 2 -

cadcam实验报告

阵M为

1 0 0

M= 0 1 0

-x -y 1 cosθ sinθ 0 -sinθ cosθ 0 0 0 1 1 0 0 0 1 0 x y 1

2、编程基本要领

1)、将显卡设置为图形模式函数为 #include(graphics.h)

#include(conio.h)

main( )

{ int driver,mode;

driver=VGA; mode=VGAMED; initgraph(&driver,& mode,””); }

2) 画直线函数为 line(x1,y1, x2,y2)

3) 4*4界矩阵相乘函数

float py[4][4],xz[4][4];m[4][4] float xc(a,b)

float a[4][4],b[4][4];

{ int i , j,k;

for(i=0;i<=3;i++)

for (j=0;j<=3;j++)

for(k=0;k<=3;k++)

- 3 -

m[i][j]= m[i][j]+ a[i][k]* b[k][j];

}

五、实验步骤

1、在C语言集成开发工具的编辑器中输入源程序

2、利用编译器编译源程序

3、连接生成执行文件

4、运行程序

六、实验数据及处理结果

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <math.h>

#include<mem.h>

#include<ctype.h>

#include<alloc.h>

#include<stdlib.h>

#define PI 3.1415926

float AX,AY,BX,BY,CX,CY;

float X1,Y1,X2,Y2,X3,Y3;

float x,y,a;

void getin()

{printf("input point ax and ay:\n");

scanf("%f %f",&AX,&AY);

printf("input point bx and by:\n");

scanf("%f %f",&BX,&BY);

printf("input point cx and cy:\n");

scanf("%f %f",&CX,&CY);

printf("input the xuanzhuan point and the jiaodu\n"); scanf("%f %f %f",&x,&y,&a);

}

void putout(float a,float b ,float c,float d,float e,float f) {int driver,mode;

driver=VGA; mode=VGAMED;

- 4 -

registerbgidriver(EGAVGA_driver);

initgraph(&driver,&mode,"c:\tc");

setcolor(BLUE);

line(AX,AY,BX,BY);

line(BX,BY,CX,CY);

line(CX,CY,AX,AY);

setcolor(RED);

line(a,b,c,d);

line(c,d,e,f);

line(e,f,a,b);

}

void chang()

{float T1[3][3]={{1,0,0},{0,1,0},{0,0,1}};

float T3[3][3]={{1,0,0},{0,1,0},{0,0,1}};

float T2[3][3]={{1,0,0},{0,1,0},{0,0,1}};

float T[3][3]={{0,0,0},{0,0,0},{0,0,0}},TT[3][3]={{0,0,0},{0,0,0},{0,0,0}}; float NEW1[3][3]={{0,0,0},{0,0,0},{0,0,0}},NEW[3][3];

int i,j,k,ii,jj,kk;

int i1,j1,k1;

/*a=-a; */

T1[2][0]=(-x);T1[2][1]=(-y);

T3[2][0]=(x);T3[2][1]=(y);

T2[0][0]=cos(a*PI/180.0);T2[0][1]=-sin(a*PI/180.00);

T2[1][0]=sin(a*PI/180.0);T2[1][1]=cos(a*PI/180.0);

for(i1=0;i1<3;i1++)

NEW[i1][2]=1;

NEW[0][0]=AX;

NEW[0][1]=AY;

NEW[1][0]=BX;

NEW[1][1]=BY;

NEW[2][0]=CX;

NEW[2][1]=CY;

{

for(i=0;i<3;i++)

for (j=0;j<3;j++)

for(k=0;k<3;k++)

T[i][j]+=T1[i][k]*T2[k][j];

}

{

for(ii=0;ii<3;ii++)

for (jj=0;jj<3;jj++)

- 5 -

for(kk=0;kk<3;kk++)

TT[ii][jj]+=T[ii][kk]*T3[kk][jj];

}

{for(i1=0;i1<3;i1++)

for(j1=0;j1<3;j1++)

for(k1=0;k1<3;k1++)

NEW1[i1][j1]+=NEW[i1][k1]*TT[k1][j1]; }

X1=NEW1[0][0];

Y1=NEW1[0][1];

X2=NEW1[1][0];

Y2=NEW1[1][1];

X3=NEW1[2][0];

Y3=NEW1[2][1];

}

void main()

{

getin();

chang();

putout(X1,Y1,X2,Y2,X3,Y3);

} 得到的图形:

cadcam实验报告

- 6 -

南昌大学实验报告

学生姓名: 学 号: 专业班级: 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:

实验二 贝赛尔曲线的生成

一、实验目的:

1、掌握参数化曲线曲面的原理和方法。

2、理解参数化曲线曲面的基本性质,特别是贝赛尔曲线的基本性质。

3、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。

二、实验要求

在二维模式下,用自编程序生成三次贝赛尔曲线。四个控制顶点的坐标可由用户任意输入。三次贝赛尔曲线和控制多边形必须同时显示在显示器上。用户改变控制点后,曲线应同时得到调整。

三、实验设备

1、计算机系统

2、安装Turbo C或其他C语言集成开发工具

四、实验原理

1、贝赛尔曲线原理

贝赛尔曲线是一种基函数为贝赛尔基函数的参数曲线,三次贝赛尔参数方程

如下:

- 7 -

cadcam实验报告

???

P(t)=(J0,3(t) J1,3(t) J2,3(t) J3,3(t))?

???p0???1??p1??33 2

=(t t t 1)??3p2?????1p3??

3?630

?3300

1?

?0?0??0???

??????p0??p1?

?p2?p3??

其中参数t∈[0,1]

P0、P1、P2、P3为四个控制顶点。贝赛尔曲线是一种逼近曲线,曲线并不过任一个控制顶点。 2、编程基本要领

1)、将显卡设置为图形模式函数为 #include(graphics.h) #include(conio.h) main( )

{ int driver,mode;

driver=VGA; mode=VGAMED; initgraph(&driver,& mode,””); }

2) 画直线函数为 line(x1,y1, x2,y2) 3) 1*4界矩阵相乘函数 float py [4],xz[4][4];m [4] float xc(a,b) float a [4],b[4][4]; { int i , j,k;

for(i=0;i<=3;i++) for (j=0;j<=3;j++)

- 8 -

m[i] = m[i] + a[j] * b[j][i];

}

4)参数取值

参数步长一般采用等步长,取1/n ,n为正整数。N的大小与显卡和显示精度有关。一般可取50。

五、实验步骤

1、在C语言集成开发工具的编辑器中输入源程序

2、利用编译器编译源程序

3、连接生成执行文件

4、运行程序

六、实验数据及处理结果

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <math.h>

int q;

float AX,AY,BX,BY,CX,CY,DX,DY;

double XX[1001],YY[1001];

void getin()

{printf("input point ax and ay:\n");

scanf("%f %f",&AX,&AY);

printf("input point bx and by:\n");

scanf("%f %f",&BX,&BY);

printf("input point cx and cy:\n");

scanf("%f %f",&CX,&CY);

printf("input point dx and dy:\n");

scanf("%f %f",&DX,&DY);

}

void putout(int a)

{int driver,mode;

int m;

driver=VGA; mode=VGAMED;

- 9 -

registerbgidriver(EGAVGA_driver);

initgraph(&driver,&mode,"c:\tc");

setcolor(YELLOW);

line(AX,AY,BX,BY);

line(BX,BY,CX,CY);

line(CX,CY,DX,DY);

setcolor(RED);

for(m=0;m<a-2;m++)

line(XX[m],YY[m],XX[m+1],YY[m+1]);

}

void main()

{ int a;

float T,TT;

float x[4],y[4];

double t[4],sub1[4];

int m[4][4]={{-1,3,-3,1},{3,-6,3,0},{-3,3,0,0},{1,0,0,0}}; int i,j,k;

printf("input a number from 50--1000:\n");

scanf("%d",&a);

getin();

TT=1/(a*1.0);

x[0]=AX;x[1]=BX;x[2]=CX;x[3]=DX;

y[0]=AY;y[1]=BY;y[2]=CY;y[3]=DY;

for(j=0,T=TT;j<a;j++,T=j*TT)

{

t[0]=T*T*T;t[1]=T*T;t[2]=T;t[3]=1;

sub1[0]=0;sub1[1]=0;sub1[2]=0;sub1[3]=0;

{

for(i=0;i<=3;i++)

for (k=0;k<=3;k++)

sub1[i]+=t[k]*m[k][i];

}

for(k=0;k<=3;k++)

{ XX[j]+=sub1[k]*x[k];

YY[j]+=sub1[k]*y[k] ;

}

}

putout(a);

/*scanf("%d",&q);*/

system("pause");

}

- 10 -

输入点数据: 100

0 0 50 200 150 200 400 0 得到的图形:

cadcam实验报告

- 11 -

实验三 、 三次B样条曲线生成

自由曲线与曲面CAD系统占有重要的地位,由于其数学原理比较复杂,一般学生理解较为困难。因此,让学生自己动手编制程序生成曲线对其理解自由曲线和曲面就非常重要。B样条曲线由于其有非常好的性能,是一种非常典型自由曲线,因此,本实验选用它作为实验对象。

一、实验目的:

1、掌握参数化曲线曲面的原理和方法。

2、理解参数化曲线曲面的基本性质,特别是B样条曲线的基本性质。

3、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。

二、实验要求

在二维模式下,用自编程序生成三次B样条曲线。四个控制顶点的坐标可由用户任意输入。三次B样条曲线和控制多边形必须同时显示在显示器上。用户改变控制点后,曲线应同时得到调整。

三、实验设备

1.计算机系统

2.安装Turbo C或其他C语言集成开发工具

四、实验原理

1、B样条曲线原理

B样条曲线是一种基函数为B样条基函数的参数曲线,三次B样条参数方程如下:

- 12 -

???

P(t)=(J0,3(t) J1,3(t) J2,3(t) J3,3(t))?

???p0???1??p1??33 2

=(t t t 1)??3p2?????1p3??

3?630

?3300

1?

?0?0??0???

??????p0??p1?

?p2?p3??

其中参数t∈[0,1]

P0、P1、P2、P3为四个控制顶点。B样条曲线是一种逼近曲线,曲线并不过任一个控制顶点。 2、编程基本要领

1)、将显卡设置为图形模式函数为 #include(graphics.h) #include(conio.h) main( )

{ int driver,mode;

driver=VGA; mode=VGAMED; initgraph(&driver,& mode,””); }

2) 画直线函数为 line(x1,y1, x2,y2) 3) 1*4界矩阵相乘函数 float py [4],xz[4][4];m [4] float xc(a,b) float a [4],b[4][4]; { int i , j,k;

for(i=0;i<=3;i++) for (j=0;j<=3;j++)

- 13 -

m[i] = m[i] + a[j] * b[j][i]; }

4)参数取值

参数步长一般采用等步长,取1/n ,n为正整数。N的大小与显卡和显示精度有关。一般可取50。 五、注意事项

P(t)、P0、P1、P2、P3都是绝对矢量,二维模式有x,y两个分量。因此,必须利

用上述方程分别求出。

???

Px(t)=(J0,3(t) J1,3(t) J2,3(t) J3,3(t))?

???

p0???1??p1??33 2

=(t t t 1)??3p2?????1p3??

3?630

?3300

1?

?0?0??0???x0

??x1?x?2?x?3???? ???

???

Py(t)=(J0,3(t) J1,3(t) J2,3(t) J3,3(t))?

???

p0???1??p1??33 2

=(t t t 1)??3p2?????1p3??

3?630

?3300

1?

?0?0??0???

??????y0??y1?y2??y3??

六、实验步骤

1、在C语言集成开发工具的编辑器中输入源程序 2、利用编译器编译源程序

3、连接生成执行文件 4、执行程序

#include <graphics.h> #include <conio.h> #include <stdio.h>

- 14 -

#include <string.h>

#include <math.h>

int q;

float AX,AY,BX,BY,CX,CY,DX,DY; double XX[1001],YY[1001]; void getin()

{printf("input point ax and ay:\n"); scanf("%f %f",&AX,&AY);

printf("input point bx and by:\n"); scanf("%f %f",&BX,&BY);

printf("input point cx and cy:\n"); scanf("%f %f",&CX,&CY);

printf("input point dx and dy:\n"); scanf("%f %f",&DX,&DY); }

void putout(int a)

{int driver,mode;

int m;

driver=VGA; mode=VGAMED; registerbgidriver(EGAVGA_driver); initgraph(&driver,&mode,"c:\tc"); setcolor(YELLOW);

- 15 -

line(AX,AY,BX,BY);

line(BX,BY,CX,CY);

line(CX,CY,DX,DY);

setcolor(BLUE);

for(m=0;m<a-2;m++)

line(XX[m],YY[m],XX[m+1],YY[m+1]);

}

void main()

{ int a;

float T,TT;

float x[4],y[4];

double t[4],sub1[4];

int m[4][4]={{-1,3,-3,1},{3,-6,3,0},{-3,0,3,0},{1,4,1,0}}; int i,j,k;

M:printf("input a number from 50--1000:\n"); scanf("%d",&a);

getin();

TT=1/(a*1.0);

x[0]=AX;x[1]=BX;x[2]=CX;x[3]=DX;

y[0]=AY;y[1]=BY;y[2]=CY;y[3]=DY;

for(j=0,T=TT;j<a;j++,T=j*TT)

- 16 -

{

t[0]=T*T*T;t[1]=T*T;t[2]=T;t[3]=1;

sub1[0]=0;sub1[1]=0;sub1[2]=0;sub1[3]=0; {

for(i=0;i<=3;i++)

for (k=0;k<=3;k++)

sub1[i]+=t[k]*m[k][i]; }

for(k=0;k<=3;k++)

{ XX[j]+=sub1[k]*x[k]/6.0; YY[j]+=sub1[k]*y[k] /6.0; }

}

putout(a);

/*scanf("%d",&q);

if(q) goto M;*/

system("pause");

}?

- 17 -

输入参数: 100 0 0 50 200 150 200 400 0

cadcam实验报告

- 18 -