C
学院:机电工程学院班级:机制10-01 姓名:范同梁
学号:541002010109 A D 实 验 报 告
一、 实验一
二、 实验二 年 月 日 目 录 二维图形复合变换编程三次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
阵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;
4
void getin()
{printf("input point ax and ay:\n");
}
void putout(float a,float b ,float c,float d,float e,float f) {int driver,mode;
driver=VGA; mode=VGAMED;
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); 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);
setcolor(RED);
line(a,b,c,d); 5
} 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;
6
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++)
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++)
7
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);
}
8
B(4,5)
旋转
30
9
南昌大学实验报告
学生姓名: 学 号: 专业班级: 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:
实验二 B样条曲线的生成
一、实验目的:
1、掌握参数化曲线曲面的原理和方法。
2、理解参数化曲线曲面的基本性质,特别是B样条曲线的基本性质。
3、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。
二、实验要求
在二维模式下,用自编程序生成三次B样条曲线。四个控制顶点的坐标可由用户任意输入。三次B样条曲线和控制多边形必须同时显示在显示器上。用户改变控制点后,曲线应同时得到调整。
三、实验设备
1、计算机系统
2、安装Turbo C或其他C语言集成开发工具
四、实验原理
1、B样条曲线原理
B样条曲线是一种基函数为B样条基函数的参数曲线,三次B样条参数方
程如下:
10
?p0???13?3????p1??3?63P(t)=(J0,3(t) J1,3(t) J2,3(t) J3,3(t))??=(t3 t2 t 1)?p?330?2???1?p?00??3?1??p0????0??p1? ???0p2?????0???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++)
11
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); 12
} 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");
13 setcolor(YELLOW); 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) { 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]; } 14
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");
B样条曲线 15
贝塞尔曲线
16
§4.3 贝塞尔曲线和B样条曲线
在前面讨论的抛物样条和三次参数样条曲线,他们的共同特点是:生成的曲线通过所有给定的型值点。我们称之为“点点通过”。但在实际工作中,往往给出的型值点并不是十分精确,有的点仅仅是出于外观上的考虑。在这样的前提下,用精确的插值方法去一点点地插值运算就很不合算;另外,局部修改某些型值点,希望涉及到曲线的范围越小越好,这也是评价一种拟合方法好坏的指标之一。
针对以上要求,法国人Bezier提出了一种参数曲线表示方法,称之为贝塞尔曲线。后来又经Gorgon, Riesenfeld和Forrest等人加以发展成为B样条曲线。
一、 贝塞尔曲线
贝塞尔曲线是通过一组多边折线的各顶点来定义。在各顶点中,曲线经过第一点和最后一点,其余各点则定义曲线的导数、阶次和形状。第一条和最后一条则表示曲线起点和终点的切线方向。
1.数学表达式
n+1个顶点定义一个n次贝塞尔曲线,其表达式为:
为各顶点的位置向量,为伯恩斯坦基函数
2.二次贝塞尔曲线
需要3个顶点,即,将其代入曲线表达式:
当时:
3.三次贝塞尔曲线
三次贝塞尔曲线需要4个点,即、、、。
其中:
贝塞尔曲线特点:
1.n个顶点定义n-1次曲线,当顶点数较大时,拟合的曲线阶次太高。
2.任一顶点对整条曲线的形状都有关系,不利于局部修改。
二、B样条曲线
用B样条曲线基函数替代伯恩斯坦基函数。
1.数学表达式
通常,给定m+n+1个顶点可以定义m+1段n次参数函数为:
(),
其中为B样条分段混合函数,形式为:
? 段数、次数 段数=节点数-次数,每段曲线与n+1个点有关;
?
2.二次B样条曲线
n=2,k=0,1,2
3.三次B样条曲线
n=3, k=0, 1, 2, 3
其中, 称为特征多边形。
例: 设,,,,用以上四个点构造2次B样条曲线。
由B样条的定义可知,4个点可定义2次B样条曲线2段:
m+n+1=4 n=2 m+1=2
实实验课程学生姓名学号专业班级验报告计算机辅助设计与制造钱志伟5901108126机制083班20xx年12月30日0目录一实验一…
实实验课程学生姓名学号专业班级验报201年月告南昌大学实验报告学生姓名学号专业班级实验类型验证综合设计创新实验日期实验成绩实验一二…
实验报告实验课程CADCAM学生姓名学号专业班级20xx年12月23日目录一实验一三次B样条曲线生成二实验二CADCAM集成1南昌…
河南理工大学高等职业学院建筑CAD技能训练报告系别建筑工程专业建筑工程技术班级建筑11-1班姓名20##年11月日建筑CAD技能训…
cad实训心得1500字cad实训心得1500字一CAD实训总结为期一周的AutoCAD终于完了好呛啊每天不用上课起来就去机房画图…