收藏 分享(赏)

插补算法——圆弧插补.pdf

上传人:精品资料 文档编号:10703774 上传时间:2019-12-29 格式:PDF 页数:18 大小:344.04KB
下载 相关 举报
插补算法——圆弧插补.pdf_第1页
第1页 / 共18页
插补算法——圆弧插补.pdf_第2页
第2页 / 共18页
插补算法——圆弧插补.pdf_第3页
第3页 / 共18页
插补算法——圆弧插补.pdf_第4页
第4页 / 共18页
插补算法——圆弧插补.pdf_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、17-6-16 上午10:16 H:Matlab Do.demo.m 第 1 页,共 1 页 % 初始化 clear,clc close all warning off feature jit off% 主程序 % R代表所插补的圆的半径 R=10; %ThetaAround代表所要插补的角度范围 ThetaAround=135,90;90,0;0,-45; % Use_SN代表所在控制的插补方向 % Use_S表示进行顺向插补 Use_N表示进行逆向插补 Use_SN=Use_S; % 通过OCT_MControl函数进行插补并返回插补信息 % Data是切削刀头的移动坐标数据 % Move

2、Position是切削刀头的移动方向信息 Data,MovePosition=OCT_MControl(ThetaAround,R,Use_SN); % 作图,动态演示插补过程 hold on grid on axis equal ezplot(strcat(x2+y2=,num2str(R2),-R,R); mycomet(Data.X,Data.Y)17-6-16 上午10:19 H:.OCT_MControl.m 第 1 页,共 1 页 function Data,MovePosition=OCT_MControl(ThetaAround,O_R,Use_SN) % 插补过程的总控制函数

3、 % 对于跨过几个象限的圆弧,程序可以分段对其每个象限圆弧进行插补 Data.X=; Data.Y=; Data.Fm=; % 确定插补段数 for n=1:size(ThetaAround,1)% 将半径及角度信息转换为插补的起始与终止点坐标Position.X_FirstPosition=O_R*cosd(ThetaAround(n,1);Position.Y_FirstPosition=O_R*sind(ThetaAround(n,1);Position.X_EndPosition=O_R*cosd(ThetaAround(n,2);Position.Y_EndPosition=O_R*

4、sind(ThetaAround(n,2);% 对每一象限的圆弧进行单独插补并返回数据TmpDatan,1=OCT_GetData(OCT_Function(Position,Use_SN);% 记录移动方向信息MovePositionn,1=TmpDatan,1.MovePosition;% 记录坐标及误差等数据信息Data.X=Data.X;TmpDatan,1.X;Data.Y=Data.Y;TmpDatan,1.Y;Data.Fm=Data.X;TmpDatan,1.Fm; end17-6-16 上午10:17 H:Matlab.mycomet.m 第 1 页,共 3 页 functi

5、on mycomet(varargin) ax,args,nargs = axescheck(varargin:); if nargs 3error(message( MATLAB:narginchk:tooManyInputs ); end if nargs = 1error(message( MATLAB:comet:InvalidP ); end ax = newplot(ax); if ishold(ax)minx,maxx = minmax(x);miny,maxy = minmax(y);axis(ax,minx maxx miny maxy) end co = get(ax,co

6、lororder); m = length(x); k = round(p*m); if size(co,1)=3colors = co(1,:);co(2,:);co(3,:);lstyle = -; elsecolors = repmat(co(1,:),3,1);lstyle = -; end head = line(parent,ax,color,colors(1,:),marker,o,linestyle,none, .xdata,x(1),ydata,y(1),Tag,head); body = matlab.graphics.animation.AnimatedLine( col

7、or,colors(2,:),.linestyle,lstyle,.Parent,ax,.MaximumNumPoints ,max(1,k),tag,body);17-6-16 上午10:17 H:Matlab.mycomet.m 第 2 页,共 3 页 tail = matlab.graphics.animation.AnimatedLine( color,colors(3,:),.linestyle,-,.Parent,ax,.MaximumNumPoints ,1+m,tag,tail); if ( length(x) 2000 )updateFcn = ()drawnow; else

8、updateFcn = ()drawnow( update); end for i = 1:kpause(0.1);set(head,xdata,x(i),ydata,y(i);if ( body.isvalid() )returnendaddpoints(body,x(i),y(i);updateFcn(); end drawnow; for i = k+1:mpause(0.1);set(head,xdata,x(i),ydata,y(i);if ( body.isvalid() )returnendaddpoints(body,x(i),y(i);addpoints(tail,x(i-k

9、),y(i-k);updateFcn(); end drawnow; for i = m+1:m+kpause(0.1);if ( body.isvalid() )returnendaddpoints(tail,x(i-k),y(i-k);17-6-16 上午10:17 H:Matlab.mycomet.m 第 3 页,共 3 页updateFcn(); end drawnow; end function minx,maxx = minmax(x) minx = min(x(isfinite(x); maxx = max(x(isfinite(x); if minx = maxxminx =

10、maxx-1;maxx = maxx+1; end end17-6-16 上午10:19 H:.OCT_GetData.m 第 1 页,共 1 页 function CurrentData=OCT_GetData(OriginData) % 提取插补返回信息 % 因为插补返回的数据信息是进行的打包的 % 所以还需要从打包的数据中把数据提取出来 Tmp1=zeros(length(OriginData),4); Tmp2=; for n=1:length(OriginData)Tmp1(n,1:3)=OriginDatan,1.Data;Tmp2n,1=OriginDatan,1.MovePos

11、ition; end % 重新构建数据 CurrentData.X=Tmp1(:,1); CurrentData.Y=Tmp1(:,2); CurrentData.Fm=Tmp1(:,3); CurrentData.MovePosition=Tmp2; end17-6-16 上午10:18 H:.OCT_Function.m 第 1 页,共 2 页 function Message=OCT_Function(Position,Use_SN) % 对单个区间的圆弧进行插补并返回进程信息 TmpData.Xm=abs(Position.X_FirstPosition); TmpData.Ym=ab

12、s(Position.Y_FirstPosition); TmpData.Fm=0; Message1,1.MovePosition= FirstPosition; Message1,1.Data=Position.X_FirstPosition,Position.Y_FirstPosition,0; StepNumber=abs(Position.X_FirstPosition-Position.X_EndPosition)+ .abs(Position.Y_FirstPosition-Position.Y_EndPosition); switch Use_SN case Use_S% 使用

13、顺向插补的处理程序段for n=1:StepNumber% 判别所要插补的象限if Position.X_FirstPosition=0 Messagen+1,1=List;elseif Position.X_FirstPosition0 Messagen+1,1=List; elseif Position.X_FirstPosition=0 Messagen+1,1=List; end endcase Use_N% 使用逆向插补的处理程序段for n=1:StepNumber% 判别所要插补的象限17-6-16 上午10:18 H:.OCT_Function.m 第 2 页,共 2 页if

14、Position.X_FirstPosition0 Messagen+1,1=List; elseif Position.X_FirstPosition=0 Messagen+1,1=List; elseif Position.X_FirstPosition0 Messagen+1,1=List;end end end end17-6-16 上午10:19 H:M.OCT_SetData.m 第 1 页,共 1 页 function TheNowPosition,RuternMessage=OCT_SetData(TheLastPosition, Quadrant) % 将切削信息打包返回,切

15、削刀头坐标位置进行更新 % 将上次插补的结束点坐标变为下次插补的开始点坐标 TheNowPosition.Xm=TheLastPosition.NewXm; TheNowPosition.Ym=TheLastPosition.NewYm; TheNowPosition.Fm=TheLastPosition.NewFm; % 装载刀头的移动方向信息 RuternMessage.MovePosition=TheLastPosition.MovePosition; % 因为插补数据中的Xm、YM信息是取了绝对值的。 % 为得到真实坐标信息,还需要进行一定的处理。 % 根据插补象限判定坐标的正负性 s

16、witch Quadrantcase 1 RuternMessage.Data=TheLastPosition.NewXm,TheLastPosition.NewYm, TheLastPosition.NewFm;case 2RuternMessage.Data=-TheLastPosition.NewXm,TheLastPosition.NewYm, TheLastPosition.NewFm;case 3RuternMessage.Data=-TheLastPosition.NewXm,-TheLastPosition. NewYm,TheLastPosition.NewFm;case 4

17、RuternMessage.Data=TheLastPosition.NewXm,-TheLastPosition.NewYm, TheLastPosition.NewFm; end end17-6-16 上午10:18 H:Matl.OCT_ForS.m 第 1 页,共 2 页 function TheLastPosition=OCT_ForS(TheNowPosition,Quadrant) % 顺向插补控制函数,就是按书的原理写的 if TheNowPosition.Fm = 0switch Quadrant case 1 TheLastPosition.MovePosition= -Y

18、;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym-1; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Ym+1; case 2TheLastPosition.MovePosition= +X;TheLastPosition.NewXm=TheNowPosition.Xm-1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPo

19、sition.Fm-2*TheNowPosition. Xm+1; case 3TheLastPosition.MovePosition= +Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym-1; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Ym+1; case 4TheLastPosition.MovePosition= -X;TheLastPosition.NewXm=TheNowPosition.Xm-1

20、;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Xm+1; end elseswitch Quadrantcase 1TheLastPosition.MovePosition= +X;TheLastPosition.NewXm=TheNowPosition.Xm+1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowP

21、osition.17-6-16 上午10:18 H:Matl.OCT_ForS.m 第 2 页,共 2 页 Xm+1; case 2TheLastPosition.MovePosition= +Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym+1; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition. Ym+1; case 3TheLastPosition.MovePosition= -X;TheLastPosition

22、.NewXm=TheNowPosition.Xm+1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition. Xm+1; case 4TheLastPosition.MovePosition= -Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym+1; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheN

23、owPosition. Ym+1; end end end17-6-16 上午10:18 H:Matl.OCT_ForN.m 第 1 页,共 2 页 function TheLastPosition=OCT_ForN(TheNowPosition,Quadrant) % 顺向插补控制函数,就是按书的原理写的 if TheNowPosition.Fm = 0switch Quadrantcase 1TheLastPosition.MovePosition= -X;TheLastPosition.NewXm=TheNowPosition.Xm-1;TheLastPosition.NewYm=The

24、NowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Xm+1; case 2TheLastPosition.MovePosition= -Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym-1; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Ym+1; case 3TheLastPosition.MovePosition

25、= +X;TheLastPosition.NewXm=TheNowPosition.Xm-1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm-2*TheNowPosition. Xm+1; case 4TheLastPosition.MovePosition= +Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym-1; TheLastPosition.NewFm=TheN

26、owPosition.Fm-2*TheNowPosition. Ym+1; end elseswitch Quadrantcase 1TheLastPosition.MovePosition= +Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym+1; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition.17-6-16 上午10:18 H:Matl.OCT_ForN.m 第 2 页,共 2 页 Ym+1; case 2Th

27、eLastPosition.MovePosition= -X;TheLastPosition.NewXm=TheNowPosition.Xm+1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition. Xm+1; case 3TheLastPosition.MovePosition= -Y;TheLastPosition.NewXm=TheNowPosition.Xm;TheLastPosition.NewYm=TheNowPosition.Ym+1;

28、TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition. Ym+1; case 4TheLastPosition.MovePosition= +X;TheLastPosition.NewXm=TheNowPosition.Xm+1;TheLastPosition.NewYm=TheNowPosition.Ym; TheLastPosition.NewFm=TheNowPosition.Fm+2*TheNowPosition. Xm+1; end end end 图 1 图 2 图 3 图 4 图 5 图 6 图 7 图 8 图 9 图 10

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报