二维几何变换代码-MATLAB.doc_第1页
二维几何变换代码-MATLAB.doc_第2页
二维几何变换代码-MATLAB.doc_第3页
二维几何变换代码-MATLAB.doc_第4页
二维几何变换代码-MATLAB.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

二、二维几何变换%c6_Test.m文件,这是主文件clear all;clc;%Main();Menu();%Menu.m文件,主界面函数% function Menu()%程序主界面函数%初始化图形数据矩阵为空Figure=;setappdata(0,FigureData,Figure);%主界面布局leftbase=10;bottombase=-50;scrsz = get(0,ScreenSize);figure(Position,scrsz(3)/3 scrsz(4)/6 scrsz(3)/3 scrsz(4)*2/3);%figure();uicontrol(Style,pushbutton,string,查看原图,position,150+leftbase 500+bottombase 100 50,. callback,show_callback);uicontrol(Style,pushbutton,string,导入图形,Position,150+leftbase 430+bottombase 100 50,. Callback,input_callback);uicontrol(Style,pushbutton,string,平移变换, Position, 150+leftbase 360+bottombase 100 50,. Callback,translation_callback);uicontrol(Style,pushbutton,string,比例变换,Position,150+leftbase 290+bottombase 100 50,. Callback,proportion_callback);uicontrol(Style,pushbutton,string,旋转变换,Position,150+leftbase 220+bottombase 100 50,. Callback,rotation_callback);uicontrol(Style,pushbutton,string,错切变换,Position,150+leftbase 150+bottombase 100 50,. Callback,shear_callback);uicontrol(Style,popup,string,关于x轴对称|关于y轴对称|关于原点对称|关于y=x对称|关于y=-x对称,. Position,150+leftbase 80+bottombase 100 50,callback,mirror_callback);%set(duichen,Callback,mirror_callback,duichen);end%show_callback.m文件function show_callback(hObj,event)%显示原始图形回调函数Figure=getappdata(0,FigureData);if isempty(Figure) errordlg(未导入图形顶点数据,error dialogue); return ;end%获取图形内部点坐标矩阵%fill=;ET=Create_ET(Figure);fill=Fill(ET);DrawFigure(Figure,fill,原图);end%input_callback.m文件function input_callback()%输入图形数据矩阵回调函数Figure=GetFigure();if isempty(Figure) setappdata(0,FigureData,Figure); msgbox(图形数据输入成功!,提示对话框);else errordlg(导入的数据为空,警告信息!);endend%translation_callback.m文件function translation_callback(hObj,event)%平移变换回调事件Figure=getappdata(0,FigureData);if isempty(Figure) errordlg(未导入图形顶点数据,error dialogue); return ;endprompt=输入x方向的增量,输入y方向的增量;%设置提示字符串title=输入平移增量;%设置标题numline=1;%指定输入数据行数defdata=0,0;%指定数据的默认值Resize=on;%设置对话框大小为可调节的answer=inputdlg(prompt,title,numline,defdata,Resize);%将输入的cell类型数据转换为整数data=str2num(char(answer);%检测用户是否点击了取消按钮if length(data)2 return ;end%读取图形顶点坐标Point=Figure(:,2,3);%进行平移变换Point=TranslationTransformation(Point,data);%构造平移变换后的图形数据矩阵Figure(:,2,3)=Point;%获取图形内部点坐标矩阵%fill=;ET=Create_ET(Figure);fill=Fill(ET);%标题Thead=strcat(平移变换-X坐标增量:,num2str(data(1),;Y坐标增量:,num2str(data(2);%输出平移变换后的图形DrawFigure(Figure,fill,Thead);end%proportion_callback.m文件function proportion_callback(hObj,event)%比例变换回调函数Figure=getappdata(0,FigureData);if isempty(Figure) errordlg(未导入图形顶点数据,error dialogue); return ;endprompt=输入x方向的比例因子Sx,输入y方向的比例因子Sy,输入比例变换基点x坐标,输入比例变换基点y坐标;%设置提示字符串title=输入比例因子S;%设置标题numline=1;%指定输入数据行数defdata=1,1,0,0;%指定数据的默认值Resize=on;%设置对话框大小为可调节的answer=inputdlg(prompt,title,numline,defdata,Resize);%将输入的cell类型数据转换为整数data=str2num(char(answer);%检测用户是否点击了取消按钮if length(data)4 return ;end%读取图形顶点坐标Point=Figure(:,2,3);%size(Point)%size(Figure),data%进行比例变换Point=ProportionTransformation(Point,data(3,4),data(1,2);%size(Point)%构造比例变换后的图形数据矩阵Figure(:,2,3)=Point;%获取比例变换后图形内部点坐标矩阵%fill=;ET=Create_ET(Figure);fill=Fill(ET);%标题Thead=strcat(比例变换-Sx=,num2str(data(1),;Sy=,num2str(data(2),;比例变换基点坐标(,num2str(data(3),num2str(data(4),);%绘制变换后图形DrawFigure(Figure,fill,Thead);end%rotation_callback.m文件function rotation_callback(hObj,event)%旋转变换回调函数Figure=getappdata(0,FigureData);if isempty(Figure) errordlg(未导入图形顶点数据,error dialogue); return ;endprompt=输入旋转角度angle(度),输入旋转变换基点x坐标,输入旋转变换基点y坐标;%设置提示字符串title=输入旋转变换参数;%设置标题numline=1;%指定输入数据行数defdata=0,0,0;%指定数据的默认值Resize=on;%设置对话框大小为可调节的answer=inputdlg(prompt,title,numline,defdata,Resize);%将输入的cell类型数据转换为整数data=str2num(char(answer);%检测用户是否点击了取消按钮if length(data)3 return ;end%读取图形顶点坐标Point=Figure(:,2,3);%进行旋转变换Point=RotateTransformation(Point,data(2,3),data(1)*pi/180);%构造旋转变换后的图形数据矩阵Figure(:,2,3)=Point;%获取旋转变换后图形内部点坐标矩阵%fill=;ET=Create_ET(Figure);fill=Fill(ET);%标题Thead=strcat(旋转变换-旋转角度:,num2str(data(1),度;旋转基点坐标(,num2str(data(2),num2str(data(3),);%绘制旋转变换后的图形DrawFigure(Figure,fill,Thead);end%shear_callback.m文件function shear_callback(hObj,event)%错切变换回调函数Figure=getappdata(0,FigureData);if isempty(Figure) errordlg(未导入图形顶点数据,error dialogue); return ;endprompt=输入错切变换参数b,输入错切变换参数c,输入错切变换基点x坐标,输入错切变换基点y坐标;%设置提示字符串title=输入错切变换参数;%设置标题numline=1;%指定输入数据行数defdata=0,0,0,0;%指定数据的默认值Resize=on;%设置对话框大小为可调节的answer=inputdlg(prompt,title,numline,defdata,Resize);%将输入的cell类型数据转换为整数data=str2num(char(answer);%检测用户是否点击了取消按钮if length(data)=2 scatter(fill(:,1),fill(:,2),.,b); end row,column=size(Figure); for k=1:row %构造第一条边的起点和终点x坐标矩阵 x=Figure(Figure(k,4),2),Figure(Figure(k,5),2); y=Figure(Figure(k,4),3),Figure(Figure(k,5),3); plot(x,y,-r,LineWidth,2); end hold off; title(heads(i).title);endend%DrawFigure.m文件,绘制图形function DrawFigure(num,fill,title)%绘制图形(通过绘制图形边界实现)%fill是图形内部的点坐标矩阵,第一列是x坐标,第二列是y坐标%title 是图形标题,字符串类型%num是图形数据矩阵,其每列定义如下:%点编号点坐标x点坐标y线段起点编号线段终点编号%依次绘制边figure(name,title);hold on;row,column=size(fill);if column=2 scatter(fill(:,1),fill(:,2),.,b);endrow,column=size(num);for i=1:row %构造第一条边的起点和终点x坐标矩阵 x=num(num(i,4),2),num(num(i,5),2); y=num(num(i,4),3),num(num(i,5),3); plot(x,y,-r,LineWidth,2);endhold off;%legend(title);end%GetFigure.m文件,获取图形数据,数据源为程序自带的*.xls文件。function Figure=GetFigure()%从指定文件中读取图形数据矩阵%图形数据矩阵的各列含义如下:%点编号点坐标x点坐标y线段起点编号线段终点编号%FileName,PathName,FilterIndex=uigetfile(*.xls,select an office file);num,text,head=xlsread(strcat(PathName,FileName);Figure=num;end%TranslationTransformation.m文件,实现平移变换function Point=TranslationTransformation(point,des)%平移变换%point为源点坐标矩阵,第一列为x坐标,第二列为y坐标%des为平移增量,第一个元素为x方向上的增量,第二个元素为y方向上的增量%首先进行参数的规格检测row,column=size(point);if column2 Point=; return ;endnum=length(des);if num2 Point=; return ;end%构造平移变换矩阵Temp=eye(3);Temp(3,1)=des(1);Temp(3,2)=des(2);Transformation=Temp;row,column=size(point);P=ones(row,column+1);P(:,1 2)=point;%进行变换运算P=round(P*Transformation);%抽取变换后点Point=P(:,1 2);end%ProportionTransformation.m文件,实现比例变换function Point=ProportionTransformation(point,base,S)%比例变换%Point是源点坐标矩阵,第一列为x坐标,第二列为y坐标%base是放缩基点,第一个元素为基点x坐标,第二个元素为基点y坐标%S是放缩比例,第一个元素为x坐标放缩比例,第二个元素为y坐标放缩比例%首先进行参数的规格检测num=length(base);if num2 Point=; return ;end%确保基点坐标为整数base=round(base);row,column=size(point);if column2 Point=; return ;endnum=length(S);if num2 Point=; return ;end%构造平移增量矩阵DS=base(1),base(2),0;Temp=eye(3);Temp(3,:)=Temp(3,:)-DS;TransForward=Temp;%预平移变换矩阵Temp=eye(3);Temp(3,:)=Temp(3,:)+DS;TransBack=Temp;%反平移变换矩阵Temp=eye(3);Temp(1,1)=S(1);Temp(2,2)=S(2);Proportion=Temp;%比例变换矩阵Transformation=TransForward*Proportion*TransBack;%复合变换矩阵row,column=size(point);P=ones(row,column+1);P(:,1 2)=point;%进行变换运算P=round(P*Transformation);%提取出变换后点坐标Point=P(:,1 2);end%RotateTransformation.m文件,实现旋转变换function Point=RotateTransformation(point,base,angle)%旋转变换%point为源点坐标矩阵%base为旋转基点,第一个元素为基点x坐标,第二个元素为基点y坐标%angle为旋转角度,弧度制,逆时针方向为正%首先进行参数的规格检测num=length(base);if num2 Point=; return ;end%确保基点坐标为整数base=round(base);if isempty(angle) Point=; return ;endrow,column=size(point);if column2 Point=; return ;end%构造平移增量矩阵DS=base(1),base(2),0;Temp=eye(3);Temp(3,:)=Temp(3,:)-DS;TransForward=Temp;%预平移变换矩阵Temp=eye(3);Temp(3,:)=Temp(3,:)+DS;TransBack=Temp;%反平移变换矩阵%构造旋转变换矩阵Temp=eye(3);Temp(1 2,1 2)=cos(angle) sin(angle);-sin(angle) cos(angle);Rotate=Temp;%构造复合变换矩阵Transformation=TransForward*Rotate*TransBack;%row,column=size(point);P=ones(row,column+1);P(:,1 2)=point;%进行复合变换运算P=round(P*Transformation);%提取变换后点坐标Point=P(:,1 2);end%ShearTransformation.m文件,实现错切变换function Point=ShearTransformation(point,base,S)%错切变换%point为源点坐标矩阵,第一列是x坐标,第二列是y坐标%base 为错切变换基点坐标,第一个元素为基点x坐标,第二个元素为基点y坐标%S为错切变换增量,第一个元素为y方向错切量b,第二个元素为x方向错切量c%首先进行参数的规格检测num=length(base);if num2 Point=; return ;end%确保基点坐标为整数base=round(base);row,column=size(point);if column2 Point=; return ;endnum=length(S);if num 关于x轴对称% 2 = 关于y轴对称% 3 = 关于原点对称% 4 = 关于y=x轴对称% 5 = 关于y=-x轴对称% 若传入的type值不在上述范围之内,则默认为3,即默认关于原点对称%首先进行参数的规格检测TransformMatrix=;row,column=size(point);if columnp(2,2) t=p(1,:); p(1,:)=p(2,:); p(2,:)=t; end %开始计算斜率倒数 d=p(2,:)-p(1,:); if d(2)=0 k1=Inf; else k1=d(1)/d(2); end %斜率为0的边不输入桶中 if k1=Inf continue; end %构造有效边, %x字段为边起始点横坐标,ymax为终点纵坐标,k1为斜率的倒数,next为具有相同起点纵坐标的下一条有效边 % AET.x=p(1,1); % AET.ymax=p(2,2); % AET.k1=k1; AET=struct(x,p(1,1),ymax,p(2,2),k1,k1); %定位有效边深度 Tindex=p(1,2)-Ymin+1; T=ET(Tindex).AET; j=1;%j表示新节点的插入位置 if isempty(T) %若当前矩阵为空,则指定结构体矩阵的各个字段 T(1).x=AET.x; T(1).ymax=AET.ymax; T(1).k1=AET.k1; else while j=length(T) if T(j).xAET.x|T(j).x=AET.x&T(j).k1AET.k1 j=j+1; else break; end end %将后序点后移 for k=length(T):-1:j T(k+1)=T(k); end %插入节点 T(j)=AET; end %更新当前桶层的结构体矩阵 ET(Tindex).AET=T; T=ET(1).AET;end%处理点扫描数为1的情况for i=1:length(ET); T=ET(i).AET; if isempty(T) for k=1:length(T) if isempty(ET(T(k).ymax-Ymin+1).AET) T(k).ymax=T(k).ymax-1; end end end ET(i).AET=T;en

温馨提示

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

评论

0/150

提交评论