二维几何变换代码-MATLAB

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二维几何变换代码-MATLAB
二、二维几何变换
%c6_Test.m文件,这是主文件
clearall;
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)/6scrsz(3)/3 scrsz(4)*2/3]);
%figure();
uicontrol('Style','pushbutton','string','查看原图','position',[150+leftba se 500+bottombase 100 50],...
'callback','show_callback');
uicontrol('Style','pushbutton','string','导入图形','P osition',[150+leftbase 430+bottombase10050],...
'Callback','input_callback');
uicontrol('Style','pushbutton','string','平移变换','Position',[150+leftbase 360+bottombase10050],...
'Callback','translation_callback');
uicontrol('Style','pushbutton','string','比例变换','Position',[150+leftbase290+b ottombase100 50],...
'Callback','proportion_callback');
uicontrol('Style','pushbutton','string','旋转变换','Position',[150+leftbase 220+bottombase 10050],...
'Callback','rotation_callback');
uicontrol('Style','pushbutton','string','错切变换','Position',[150+leftb ase 150+bottombase100 50],...'Callback','shear_callback');
uicontrol('Style','popup','string','关于x轴对称|关于y轴对称|关于原点对称|关于y=x对称|关于y=-x对称',...
'Position',[150+leftbase80+bottombase10050],'callback',@mirror _callback);
%set(duichen,'Callback',{@mirror_callback,duiche n});
end
%show_callback.m文件
function show_callback(hObj,event)
%显示原始图形回调函数
Figure=getappdata(0,'FigureData');
ifisempty(Figure)
errordlg('未导入图形顶点数据','errordialogue');
return ;
end
%获取图形内部点坐标矩阵
%fill=[];
ET=Create_ET(Figure);
fill=Fill(ET);
DrawFigure(Figure,fill,'原图');
end
%input_callback.m文件
functioninput_callback()
%输入图形数据矩阵回调函数
Figure=GetFigure();
if~isempty(Figure)
setappdata(0,'FigureData',Figure);
msgbox('图形数据输入成功!','提示对话框');
else
errordlg('导入的数据为空','警告信息!');
end
end
%translation_callback.m文件
function translation_callback(hObj,event)
%平移变换回调事件
Figure=getappdata(0,'FigureData');
ifisempty(Figure)
errordlg('未导入图形顶点数据','error dialogue');
return;
end
prompt={'输入x方向的增量','输入y方向的增量'};%设置提示字符串title='输入平移增量';%设置标题
numline=1;%指定输入数据行数
defdata={'0','0'};%指定数据的默认值
Resize='on';%设置对话框大小为可调节的
answer=inputdlg(prompt,title,numline,defdata,Resize);
%将输入的cell类型数据转换为整数
data=str2num(char(answer));
%检测用户是否点击了取消按钮
iflength(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(dat a(2)));
%输出平移变换后的图形
DrawFigure(Figure,fill,Thead);
end
%proportion_callback.m文件
function proportion_callback(hObj,event)
%比例变换回调函数
Figure=getappdata(0,'FigureData');
ifisempty(Figure)
errordlg('未导入图形顶点数据','errordialogue');
return;
end
prompt={'输入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文件
functionrotation_callback(hObj,event)
%旋转变换回调函数
Figure=getappdata(0,'FigureData');
if isempty(Figure)
errordlg('未导入图形顶点数据','error dialogue');
return ;
end
prompt={'输入旋转角度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)),'度;旋转基点坐标(',n um2str(data(2)),',',num2str(da ta(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;
end
prompt={'输入错切变换参数b','输入错切变换参数c','输入错切变换基点x坐标','输入错切变换基点y坐标'};%设置提示字符串title='输入错切变换参数';%设置标题
numline=1;%指定输入数据行数
defdata={'0','0','0','0'};%指定数据的默认值
Resize='on';%设置对话框大小为可调节的
answer=inputdlg(prompt,title,numline,def
data,Resize);
%将输入的cell类型数据转换为整数
data=str2num(char(answer));
%检测用户是否点击了取消按钮
if length(data)<4
return;
end
%读取图形顶点坐标
Point=Figure(:,[2,3]);
%进行错切变换
Point=ShearTransformation(Point,data([3,4]),data ([1,2]));
%构造错切变换后的图形数据矩阵
Figure(:,[2,3])=Point;
%获取错切变换后图形内部点坐标矩阵
%fill=[];
ET=Create_ET(Figure);
fill=Fill(ET);
%标题
Thead=strcat('错切变换---错切参数:b=',num2str(data(1)),',c=',num2str(data(2)),';错切变换基点坐标(',num2str(data(3)),',',num2str(data(4)),')');
%绘制变换后图形
DrawFigure(Figure,fill,Thead);
end
%mirror_callback.m文件
function mirror_callback(hObj,event)
%对称变换回调函数
FFigure=getappdata(0,'FigureData');
Figure=FFigure;
ifisempty(Figure)
errordlg('未导入图形顶点数据','error dialogue');
return;
end
%获取所选择的对称类型
%heads=['关于x轴对称','关于y轴对称','关于原点对称','关于y=x对称','关于y=-x 对称','原始图形'];
heads(1).title='关于x轴对称';
heads(2).title='关于y轴对称';
heads(3).title='关于原点对称';
heads(4).title='关于y=x对称';
heads(5).title='关于y=-x对称';
heads(6).title='原始图形';
%读取图形顶点坐标
Point=Figure(:,[2,3]);
%进行对称变换
Point=MirrorTransformation(Point);
%添加原始顶点坐标
Point(length(Point)+1).data=FFigure(:,[2,3]);
%构造对称变换后的图形数据矩阵
figure('name','五中对称变换及原图对比图');
for i=1:length(Point)
NPoint=Point(i).data;
Figure(:,[2,3])=NPoint;
%获取对称变换后图形内部点坐标矩阵
ET=Create_ET(Figure);
fill=Fill(ET);
subplot(2,3,i);
hold on;
[row,column]=size(fill);
if column>=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);
end
end
%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');
end
[row,column]=size(num);
fori=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);
end
hold off;
%legend(title);
end
%GetFigure.m文件,获取图形数据,数据源为程序自带的*.xls文件。

function Figure=GetFigure()
%从指定文件中读取图形数据矩阵
%图形数据矩阵的各列含义如下:
%点编号?点坐标x 点坐标y 线段起点编号线段终点编号
%
[FileName,PathName,FilterIndex]=uigetfile('*.xls','select anofficefile');[num,text,head]=xlsread(strcat(PathName,FileName));
Figure=num;
end
%TranslationTransformation.m文件,实现平移变换
function Point=TranslationTransformation(poi nt,des)
%平移变换
%point为源点坐标矩阵,第一列为x坐标,第二列为y坐标
%des为平移增量,第一个元素为x方向上的增量,第二个元素为y方向上的增量
%
%首先进行参数的规格检测
[row,column]=size(point);
if column<2
Point=[];
return;
end
num=length(des);
ifnum<2
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(:,[12])=point;
%进行变换运算
P=round(P*Transformation);
%抽取变换后点
Point=P(:,[12]);
end
%ProportionTransformation.m文件,实现比例变换
function Point=ProportionTransformation(poin t,base,S)
%比例变换
%Point是源点坐标矩阵,第一列为x坐标,第二列为y坐标
%base是放缩基点,第一个元素为基点x坐标,第二个元素为基点y坐标
%S是放缩比例,第一个元素为x坐标放缩比例,第二个元素为y
坐标放缩比例
%
%首先进行参数的规格检测
num=length(base);
if num<2
Point=[];
return;
end
%确保基点坐标为整数
base=round(base);
[row,column]=size(point);
ifcolumn<2
Point=[];
return ;
end
num=length(S);
if num<2
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=T emp;%反平移变换矩阵
Temp=eye(3);
Temp(1,1)=S(1);
Temp(2,2)=S(2);
Proportion=Temp;%比例变换矩阵
Transformation=TransForward*Proportion*TransB ack;%复合变换矩阵[row,column]=size(point);
P=ones(row,column+1);
P(:,[12])=point;
%进行变换运算
P=round(P*Transformation);
%提取出变换后点坐标
Point=P(:,[1 2]);
end
%RotateTransformation.m文件,实现旋转变换
functionPoint=RotateTransformation(point,base,angle)
%旋转变换
%point为源点坐标矩阵
%base为旋转基点,第一个元素为基点x坐标,第二个元素为基点y坐标
%angle为旋转角度,弧度制,逆时针方向为正
%
%首先进行参数的规格检测
num=length(base);
if num<2
Point=[];
return ;
end
%确保基点坐标为整数
base=round(base);
ifisempty(angle)
Point=[];
return ;
end
[row,column]=size(point);
ifcolumn<2
Point=[];
return;
end

%构造平移增量矩阵
DS=[base(1),base(2),0];
Temp=eye(3);
Temp(3,:)=Temp(3,:)-DS;
TransForward=T emp;%预平移变换矩阵
Temp=eye(3);
Temp(3,:)=Temp(3,:)+DS;
TransBack=T emp;%反平移变换矩阵
%构造旋转变换矩阵
Temp=eye(3);
Temp([12],[12])=[cos(angle) sin(angle);-sin(angle) cos(angle)]; Rotate=Temp;
%构造复合变换矩阵
Transformation=TransForward*Rotate*TransBack;

[row,column]=size(point);
P=ones(row,column+1);
P(:,[12])=point;
%进行复合变换运算
P=round(P*Transformation);
%提取变换后点坐标
Point=P(:,[12]);
end
%ShearTransformation.m文件,实现错切变换
functionPoint=ShearTransformation(point,base,S)
%错切变换
%point为源点坐标矩阵,第一列是x坐标,第二列是y坐标
%base为错切变换基点坐标,第一个元素为基点x坐标,第二个元素为基点y坐标%S为错切变换增量,第一个元素为y方向错切量b,第二个元素为x方向错切量c
%
%首先进行参数的规格检测
num=length(base);
ifnum<2
Point=[];
return ;
end
%确保基点坐标为整数
base=round(base);
[row,column]=size(point);
if column<2
Point=[];
return;
end
num=length(S);
ifnum<2
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(2,1)=S(2);
Temp(1,2)=S(1);
Shear=Temp;
%构建变换矩阵
Transformation=TransForward*Shear*TransBack;
%获取源点坐标
[row,column]=size(point);
P=ones(row,column+1);
P(:,[1,2])=point;
%进行错切运算
P=round(P*Transformation);
%提取变换后点坐标
Point=P(:,[1,2]);
end
%MirrorTransformation.m文件,实现对称变换
function Point=MirrorTransformation(point)
%对称变换
%point为变换源点坐标,第一列为x坐标,第二列为y坐标
%Point为三维矩阵,第一维共5个元素,分别对应5中对称运算得到的新坐标点。

%type为变换类型,其值代表的含义如下:
% 1 => 关于x轴对称
% 2=>关于y轴对称
% 3 => 关于原点对称
% 4 => 关于y=x轴对称
% 5=>关于y=-x轴对称
% 若传入的type值不在上述范围之内,则默认为3,即默认关于原点对称
%
%首先进行参数的规格检测
TransformMatrix=[];
[row,column]=size(point);
ifcolumn<2
Point=[];
return ;
end
%构建变换矩阵。

相关文档
最新文档