1、二、二维几何变换%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,pus
2、hbutton,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,transla
3、tion_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+leftbas
4、e 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)%
5、显示原始图形回调函数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,Fi
6、gureData,Figure);msgbox(图形数据输入成功!,提示对话框);elseerrordlg(导入的数据为空, 警告信息!);endend%translation_callback.m 文件function translation_callback(hObj,event)%平移变换回调事件Figure=getappdata(0,FigureData);if isempty(Figure)errordlg(未导入图形顶点数据,error dialogue);return ;endprompt=输入 x 方向的增量,输入 y 方向的增量;%设置提示字符串title=输入平移增量;%设
7、置标题numline=1;%指定输入数据行数defdata=0,0;%指定数据的默认值Resize=on;%设置对话框大小为可调节的answer=inputdlg(prompt,title,numline,defdata,Resize);%将输入的 cell 类型数据转换为整数data=str2num(char(answer);%检测用户是否点击了取消按钮if length(data)=2scatter(fill(:,1),fill(:,2),.,b);endrow,column=size(Figure);for k=1:row%构造第一条边的起点和终点 x 坐标矩阵x=Figure(Figu
8、re(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);endhold off;title(heads(i).title);endend%DrawFigure.m 文件,绘制图形function DrawFigure(num,fill,title)%绘制图形(通过绘制图形边界实现)%fill 是图形内部的点坐标矩阵,第一列是 x 坐标,第二列是 y 坐标%title 是图形标题,字符串类型%num 是图形数据矩阵,其每列定义如下:%点编号 点坐
9、标 x 点坐标 y 线段起点编号 线段终点编号%依次绘制边figure(name,title);hold on;row,column=size(fill);if column=2scatter(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
10、%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 文件,实现平移变换fu
11、nction Point=TranslationTransformation(point,des)%平移变换%point 为源点坐标矩阵,第一列为 x 坐标,第二列为 y 坐标%des 为平移增量,第一个元素为 x 方向上的增量,第二个元素为 y 方向上的增量%首先进行参数的规格检测row,column=size(point);if column 关于 x 轴对称% 2 = 关于 y 轴对称% 3 = 关于原点对称% 4 = 关于 y=x 轴对称% 5 = 关于 y=-x 轴对称% 若传入的 type 值不在上述范围之内,则默认为 3,即默认关于原点对称%首先进行参数的规格检测Transfor
12、mMatrix=;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)=0k1=Inf;elsek1=d(1)/d(2);end%斜率为 0 的边不输入桶中if k1=Infcontinue;end%构造有效边,%x 字段为边起始点横坐标 ,ymax 为终点纵坐标,k1 为斜率的倒数,next 为具有相同起点纵坐标的下一条有效边% AET.x=p(1,1);% AET.ymax=p(2,2);% AET.k1=k1;AET=struct(
13、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;elsewhile j=length(T)if T(j).xAET.x|T(j).x=AET.xelsebreak;endend%将后序点后移for k=length(T):-1:jT(k+1)=T(k);end%插入节点T(j)=AET;end%更新当
14、前桶层的结构体矩阵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;endendendET(i).AET=T;endend%Fill.m 文件,填充区域function Point=Fill(ET)%ET 为边表%Point 为填充的像素点%T 是当前有效边的头节点,T.next 指向首元节点%用矩阵 AET 存储当前
15、 AET 表AET=;Point=;for i=1:length(ET)if isempty(ET(i).AET)%开始合并T1=ET(i).AET;T2=AET;T3=;%临时矩阵m=1;n=1;if i=61Temp=ET(i).AET;size(Temp);for q=1:length(Temp)Temp(q);endendwhile m=length(T1)m=m+1;elseElem=T2(n);n=n+1;endT3=T3;Elem; end%连接 T1 剩余部分for p=m:length(T1)T3=T3;T1(p);end%连接 T2 剩余部分for p=n:length(T
16、2)T3=T3;T2(p);endAET=T3;%合并完成end%if isempty(AET)sign=false;%开始填充 for p=1:length(AET)sign=sign;if signx=ceil(AET(p).x) floor(AET(p+1).x);for k=x(1):x(2)Point=Point;k ET(i).ystart;endendend%删除 ET(i).ystart=AET(j).ymax 的边T3=;for p=1:length(AET)if (AET(p).ymax=ET(i).ystart)T3=T3;AET(p);endend%重新计算 xfor p=1:length(T3)T3(p).x=T3(p).x+T3(p).k1;endAET=T3;endendPoint=Point;end%图形 1-1.xls 文件数据点编号 点坐标 x 点坐标 y 线段起点编号 线段终点编号1 3 7 1 22 11 3 2 33 9 16 3 44 0 6 4 1