前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于奇怪的羊返航,聊plot图像镜像

基于奇怪的羊返航,聊plot图像镜像

作者头像
巴山学长
发布2020-03-25 16:05:21
4190
发布2020-03-25 16:05:21
举报
文章被收录于专栏:巴山学长

之前过冷水有推出matlab动态绘图推文深受读者关注,细心的读者会发现渡河动态图有许多瑕疵,过冷水深知这一点,会逐步提高推文水平的,本期我们一起看一个将近有点熟视无睹的问题。

羊返航过程中羊头为何和运动方向相反?我们就不能让它回头吗?这个问题读者想一下how should do?

过冷水首先想到的是推文大神带你玩转matlab图像处理 (一)中提到的图像水平镜像命令:B=fliplr(A),不幸的是该命令的各种形式都尝试一遍,也没能让羊回头。

我就查阅了一下fliplr命令的工作原理。在此简单讲一下fliplr命令的的作用是对矩阵内的横列元素位置进行反转,列元素的位置保持不变。

渡河问题中的所有对象都是一维绘图矩阵,使用该命令无法实现我们想要的羊回头。可以看出fliplr命令是受限的。不能因为我们称之为图像镜像命令,就觉得其能实现镜像功能,要灵活理解。解决羊回头的问题,需要想其它方法。过冷水在思索着中突然想到之前和大家分享的matlab绘图(五)中就有涉及到图像反转。

完美的解决方式,同样的套路我们可以尝试一下能不能绘制羊的反转图。

代码如下:

代码语言:javascript
复制
clear all
load('农夫渡河.mat')%导入农夫、狼、羊图像数据:程序要放在存放“农夫渡河.mat”文件的目录下运行保证顺利读取数据
figure1=figure
axes1 = axes('Parent',figure1);
hold on
axis off
%% 绘制农夫过河对象图
%绘制狼
wolf=cell2mat(U(2,1));
Wolf=fill(wolf(:,1),wolf(:,2),'k');
%绘制南瓜
pumpkin1=cell2mat(U(3,1));pumpkin2=cell2mat(U(3,2));pumpkin3=cell2mat(U(3,3));pumpkin4=cell2mat(U(3,4));pumpkin5=cell2mat(U(3,5));pumpkin6=cell2mat(U(3,6));pumpkin7=cell2mat(U(3,7));pumpkin8=cell2mat(U(3,8));pumpkin9=cell2mat(U(3,9));pumpkin10=cell2mat(U(3,10));pumpkin11=cell2mat(U(3,11));pumpkin12=cell2mat(U(3,12));pumpkin13=cell2mat(U(3,13));pumpkin14=cell2mat(U(3,14));pumpkin15=cell2mat(U(3,15));
Pumpkin1=plot(pumpkin1(:,1),pumpkin1(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin2=plot(pumpkin2(:,1),pumpkin2(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin3=plot(pumpkin3(:,1),pumpkin3(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin4=plot(pumpkin4(:,1),pumpkin4(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin5=plot(pumpkin5(:,1),pumpkin5(:,2),'LineWidth',3,'Color',[0.466666668653488 0.674509823322296 0.18823529779911]);
Pumpkin6=plot(pumpkin6(:,1),pumpkin6(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin7=plot(pumpkin7(:,1),pumpkin7(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin8=plot(pumpkin8(:,1),pumpkin8(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin9=plot(pumpkin9(:,1),pumpkin9(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin10=plot(pumpkin10(:,1),pumpkin10(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin11=plot(pumpkin11(:,1),pumpkin11(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin12=plot(pumpkin12(:,1),pumpkin12(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Pumpkin13=plot(pumpkin13(:,1),pumpkin13(:,2),'LineWidth',2,'Color',[0 0.498039215803146 0]);
Pumpkin14=plot(pumpkin14(:,1),pumpkin14(:,2),'LineWidth',2,'Color',[0 0.498039215803146 0]);
Pumpkin15=plot(pumpkin15(:,1),pumpkin15(:,2),'LineWidth',2,'Color',[0 0.498039215803146 0]);
%绘制农夫
farmer1=cell2mat(U(4,1));farmer2=cell2mat(U(4,2));farmer3=cell2mat(U(4,3));farmer4=cell2mat(U(4,4));farmer5=cell2mat(U(4,5));farmer6=cell2mat(U(4,6));farmer7=cell2mat(U(4,7));farmer8=cell2mat(U(4,8));farmer9=cell2mat(U(4,9));farmer10=cell2mat(U(4,10));farmer11=cell2mat(U(4,11));farmer12=cell2mat(U(4,12));farmer13=cell2mat(U(4,13));farmer14=cell2mat(U(4,14));farmer15=cell2mat(U(4,15));farmer16=cell2mat(U(4,16));farmer17=cell2mat(U(4,17));farmer18=cell2mat(U(4,18));farmer19=cell2mat(U(4,19));farmer20=cell2mat(U(4,20));
Farmer1=plot(farmer1(:,1),farmer1(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Farmer2=plot(farmer2(:,1),farmer2(:,2),'LineWidth',2,'Color',[1 0.843137264251709 0]);
Farmer3=fill(farmer3(:,1),farmer3(:,2),'k');
Farmer4=fill(farmer4(:,1),farmer4(:,2),'r');
Farmer5=plot(farmer5(:,1),farmer5(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer6=plot(farmer6(:,1),farmer6(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer7=plot(farmer7(:,1),farmer7(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer8=plot(farmer8(:,1),farmer8(:,2),'LineWidth',2,'Color',[1 0.600000023841858 0.7843137383461]);
Farmer9=plot(farmer9(:,1),farmer9(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer10=plot(farmer10(:,1),farmer10(:,2),'LineWidth',3,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer11=plot(farmer11(:,1),farmer11(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
Farmer12=plot(farmer12(:,1),farmer12(:,2),'k');
Farmer13=plot(farmer13(:,1),farmer13(:,2),'k');
Farmer14=plot(farmer14(:,1),farmer14(:,2),'LineWidth',3,'Color',[0 0 0]);
Farmer15=plot(farmer15(:,1),farmer15(:,2),'LineWidth',3,'Color',[0 0 0]);
Farmer16=fill(farmer16(:,1),farmer16(:,2),[0.800000011920929 0.800000011920929 0.800000011920929]);
Farmer17=fill(farmer17(:,1),farmer17(:,2),[0.800000011920929 0.800000011920929 0.800000011920929]);
Farmer20=plot(farmer20(:,1),farmer20(:,2),'LineWidth',2,'Color',[0.87058824300766 0.490196079015732 0]);
%boat
boat1=cell2mat(U(5,1));boat2=cell2mat(U(5,2));
Boat1=fill(boat1(:,1),boat1(:,2),[1 0 1]);
Boat2=fill(boat2(:,1),boat2(:,2),[0.854901969432831 0.701960802078247 1]);
%绘制河岸
line([7550;7550],[2200,2600],'color','r','linestyle','-','linewidth',1.5);
line([8100;8100],[2200,2600],'color','r','linestyle','-','linewidth',1.5);
xlim([7300 8350]);
ylim([2200 2600]);
%绘制掉头羊
axes2 = axes('Parent',figure1,'Position',get(axes1,'position'));
axis off
hold(axes2,'on');
shape=cell2mat(U(1,1));
Shape=fill(shape(:,1),shape(:,2),'k');
set(axes2,'Color','none','FontSize',11,'FontWeight','bold','Layer','LineWidth',2,'XDir','reverse','XTickLabel',[],'YAxisLocation','right','ylim',get(axes1,'ylim'),'xlim',get(axes1,'xlim'),'layer','top'); 

Success!该方法可以实现羊掉头的问题,不过在动态绘图过程中该方法并不实用,why?

(1)因为该方法的本质是两个图层叠加的结果。既然是两个图层叠加,那么羊和农夫运动起来也是两套不同的命令,造成编程麻烦。

(2)当羊再次需要掉头的时候原先的图层该如何解决?代码中不断删掉图层然后再新建图层?这样看起来会不会有点傻。有没有更好的方法呢?只要肯专研,总能找出完美的解决方案,让过冷水给你娓娓道来。

过冷水想到的方法是只需使用一点点高中的数学图像知识即可。

(1)令x2=-x1,即可绘制(x1,y1)关于Y轴镜像对称的图像(x2,y1)。

(2)令x3=x2+2*(n),即可得到以n为镜像对称的图像(x3,y1)。

针对我们的问题,我们只需要选择合适的n就可以让羊掉头。

过冷水在初次绘制matlab动态绘图过程中是当时采用fliplr命令以失败告终,于是就把镜像问题忽略了。之后一直思索,在某个暖阳的午后突然灵光一闪就在知道了how do。在matlab学习过程中有好多细节需要我们注意,学习不可囫囵吞枣,书上怎么说,我们就这么做,这样是无法解决实际问题的。遇到问题多思索就会发现interesting thing。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档