转载于《MATLAB基础与应用教程(第2版)》蔡旭晖 刘卫国 蔡立燕 | 微信读书
MATLAB 的图形是由不同图形对象组成的
MATLAB 用句柄来标识对象,我们可以通过句柄来访问相应对象的属性MATLAB R2014b以后嘚版本采用OpenGL作为默认图形渲染器,加强和扩展了通过图形对象句柄对各种图形对象进行修改和控制的方法
第4章介绍的绘图函数主要通过命令参数控制图形的绘制过程,图形每一部分的属性都是按默认属性或命令中选项的指定值进行设置适用于绘制简单界面、单一图形,充分体现了 MATLAB 语言的实用性
相对于命令参数的自定义绘图,通过句柄设置对象属性绘图操作控制和表现图形的能力更强,可以对图形对潒进行更灵活、精细的控制充分体现了MATLAB语言的开放性。
● 了解图形对象和图形对象句柄的基本概念
● 掌握图形对象属性的基本设置方法。
● 掌握利用图形对象控制绘图操作的方法
● 熟悉图形对象优化方法。
MATLAB的图形系统是面向对象的图形类是MATLAB为了描述具有类似特征的圖形元素而定义的具有一些公共属性的抽象的元素集合,而由图形类定义的图形对象是用于控制图形显示和生成用户界面的基本要素
MATLAB 的图形对象包括图形窗口、坐标轴、用户界面控件、曲线、曲面、文本、图像等。在MATLAB中每一个具体的图形都是由若干個不同的图形对象组成的,例如绘图操作中曲线、曲面、坐标轴、图形窗口,都是图形对象图形对象是有层次的,其层次结构如图9.1所礻系统将各种图形对象按树形结构组织起来。一个项目可以包含一个或多个图形窗口一个图形窗口可包含一组或多组坐标轴,每一组唑标轴上又可绘制多种图形如曲线、曲面、文本等。
图形窗口(Figure)对象是显示图形的窗口和与用户进行交互的界面其他图形对象都是圖形窗口对象的子对象。图形窗口是根对象下的一级对象坐标轴和用户界面对象是图形窗口的子对象,图形对象(曲线、曲面、文本)囷图表等是坐标轴的子对象通常,我们直接在坐标轴中放置图形对象和图表但有时为方便管理,也可以用组对象作为容器容纳相关聯的图形对象和图表。
9.1 图形对象的层次结构
创建图形对象的函数与所创对象的类型有相同名称例如,text函数创建Text(文本)对象 figure函数创建Figure(图形窗口)对象。
在 MATLAB 系统中建立一个对象系统就会建立一个映射该对象的句柄,用于存储相应对象的属性在MATLAB中,我们可以通过句柄對图形对象进行操作
在以前的MATLAB 版本中,图形句柄(Handle)是一个实数从R2014b起,图形句柄成为对象句柄一个句柄对应着一个图形对象,可以鼡对象句柄设置和查询对象属性
MATLAB提供了若干个函数用于识别特定图形对象,如表9.1所示
表9.1 常用图形对象的识别函数
可以利用图形对象的Parent屬性获取包容此图形对象的容器,Children属性获取此对象所容纳的图形对象在获取对象的句柄后,可以通过句柄来获取或设置对象的属性
【唎9.1】 绘制曲线并查看有关对象的属性。
结果显示当前坐标轴中有3个曲线对象要查看其中某个对象的属性,如第1个对象使用以下命令:
單击最后一行的链接“所有属性”,则会显示该对象的所有属性值
每种图形对象都具有各种各样的属性(Property),MATLAB 就是通过对属性的操作来控淛和改变图形对象的外观和行为的。
同一类对象有着相同的属性属性的取值决定了对象的表现。例如LineStyle是曲线对象的一个属性,它的值決定着线型取值可以是’-’ 、’:’、’-.’、’–’或’none’。在属性名的写法中不区分字母的大小写,而且在不引起歧义的前提下属性名可以只写前一部分。例如lines就代表LineStyle。
访问图形对象是指获取或设置图形对象的属性不同图形对象所具有的属性不同,但访问的方法昰一样的MATLAB 2014b及以后的版本,一般使用点运算符来访问对象属性一般形式是:对象句柄.属性名。例如h1.Color表示引用图形对象h1的Color属性。
(1)设置图形对象属性
其中H是图形对象的句柄。绘制二维和三维曲线时可以通过设置已有图形对象的属性修改曲线的颜色、线型和数据点的標记符号等。例如绘制正弦曲线,然后将曲线线型修改为虚线线条颜色为红色,可使用以下命令:
这种设置图形对象属性的方法每次呮能作用于一个图形对象若同时设置一组图形对象的属性,可以使用set函数set函数的调用格式为
其中,H用于指明要操作的图形对象如果H昰一个由多个图形对象句柄构成的向量,则操作施加于H的所有对象第1种格式,Name指定属性属性名要用单撇号括起来,Value为该属性的值第2種格式中,NameArray、ValueArray是单元数组存储了H所有对象的属性,NameArray存储属性名ValueArray存储属性值。要为m个图形对象中的每个图形对象设置n个属性值则NameArray是有n個元素的行向量,ValueArray应为m×n的单元数组例如,绘制3条曲线然后将曲线线型全部修改为虚线,线条颜色为蓝色可以使用以下命令:
若3条曲线分别采用不同颜色、不同线型,则可以使用以下命令:
(2)获取图形对象属性
1 0 0
其中H是图形对象的句柄,Name是属性名例如,以下命令鼡来获得前述曲线h1的颜色属性值:
这种方法每次只能获取一个图形对象的属性若需要获取一组图形对象的属性,可以采用get函数get函数的调用格式为
其中,H是图形对象句柄选项Name指定要访问的属性,V存储返回的属性值如果在调用get函数时省略Name,将返回对象所有嘚属性值例如,hlines是前面绘制的一组图形对象的句柄包含3条曲线,要得到这些曲线的属性可以使用以下命令:
可通过inspect函数打开属性检查器,查询和修改图形对象的属性inspect函数的调用格式如下:
其中,参数H、h1、h2等是图形对象句柄第2种格式在打开属性检查器后,只显示所列图形对象都拥有的属性例如:
执行命令“inspect(h1)”打开图9.2(a)所示检查器,执行命令“inspect([h1,h2])”打开图9.2 (b)所示检查器
图9.2 图形对象属性检查器
图形对象具有各种各样的属性,有些属性是所有对象共同具备的有些属性则是各对象所特有的。这里先介绍图形对象的常用公共属性即夶部分对象都具有的属性。
【例 9.2】 分别在并排的两个坐标轴中绘制一条曲线和一个曲面然后设置左坐标轴的背景色为黄色,曲线线條颜色为红色设置右坐标轴的背景色为青色。
所有图形对象都可以由与之同名的绘图函数创建所创建的对象置于某个父对象中,当父對象不存在时MATLAB会自动创建它。例如用plot函数画一条曲线,假如在画线之前坐标轴已经存在,则在当前坐标轴上画线;若坐标轴不存在MATLAB会自动创建它们。
前面介绍了图形对象的公共属性本节介绍图形窗口对象和坐标轴对象的创建方法及特殊属性。
图形窗口是显示图形忣与用户交互的窗口每一个图形窗口可以作为其他图形对象的父对象,即当作坐标轴、控件等对象的容器MATLAB的一切图形图像的输出都是茬图形窗口中完成的。掌握好图形窗口的控制方法对于充分发挥 MATLAB 的图形功能和设计高质量的用户界面是十分重要的。
1.图形窗口的基本操莋 MATLAB通过figure函数来创建窗口对象其调用格式为
句柄变量=figure(属性名1,属性值1属性名2,属性值2,…)
其中属性用于设置图形窗口的呈现方式。如果調用时不带参数则按图形窗口的默认属性值建立图形窗口。
如果figure函数的参数是窗口句柄即
则设定该句柄对应的窗口为当前窗口,随后嘚操作都是在这个窗口中实施的
要关闭图形窗口,应使用close函数其调用格式为
“close all”命令关闭所有的图形窗口。
要清除图形窗口的内容泹不关闭窗口,则使用clf函数其调用格式为
不带参数的clf函数,表示清除当前图形窗口的内容
2.图形窗口的属性 图形窗口除公共属性外,还囿控制图形窗口外观、交互控制、回调执行控制、键盘控制、鼠标控制、窗口控制等多类属性常用属性如下。
图形窗口对象的默认度量单位(Units)为’pixels’即像素。
【例 9.3】 建立一个图形窗口该图形窗口没有菜单條,标题名称为“图形窗口实例”图形窗口位于距屏幕左下角(2, 2)(单位:cm)处,宽度和高度分别为24cm和16cm当用户在键盘上按下任意键时,在圖形窗口绘制正弦曲线
坐标轴是在图形窗口中定义的一个画图区域。坐标轴对象是图形窗口的子对象每个图形窗口中可以定义多个坐標轴,但只有一个坐标轴是当前坐标轴坐标轴对象是图形对象的父对象,即当作图形图像的容器在没有指明坐标轴时,所有的图形图潒都是在当前坐标轴中输出
1.坐标轴的基本操作 建立坐标轴对象使用axes函数,其调用格式为
句柄变量=axes(parent属性名1,属性值1属性名2,属性值2,…)
其中属性用于设置坐标轴的特征,选项parent用于指定坐标轴的父对象可以是图形窗口对象、面板对象或选项卡对象的句柄。若调用axes函数时鈈带参数则按坐标轴的默认属性在当前图形窗口创建坐标轴。
如果axes函数的参数是坐标轴句柄即
则设定该句柄代表的坐标轴为当前坐标軸,随后绘制的图形都显示在这个坐标轴中
要清除坐标轴中的图形,则使用cla函数其调用格式为
不带参数的cla函数,表示清除当前坐标轴Φ的图形
2.坐标轴的属性 坐标轴除公共属性外,还有控制坐标轴外观、标度、刻度、网格、视图等特征的属性常用属性如下。
坐标軸对象的默认度量单位(Units)为’normalized’,即根据容器(图形窗口或面板)进行归一化容器的左下角映射为(0,0),右上角映射为(1,1)
【例9.4】 利用坐标軸对象实现图形窗口的任意分割。
grid on; %显示网格线
程序执行结果如图9.3所示利用axes函数可以在不影响图形窗口上其他坐标轴的前提丅建立一个新的坐标轴,从而实现图形窗口的任意分割
图9.3 利用坐标轴对象分割图形窗口
MATLAB将曲线、矩形、曲面、文本,以及图形中的标注、图例等均视为图形数据对象本节介绍图形数据对象的操作。
曲线对象既可以定义在二维坐标系中又可以定义在三维坐标系中。曲线對象除了用第4章介绍的plot、plot3函数创建外还可以用line函数创建。line函数调用格式为
其中输入参数x、y、z的含义和用法与plot、plot3函数一样,属性的设置與前面介绍过的figure、axes函数类似选项ax用于指定曲线所属坐标轴,默认在当前坐标轴绘制曲线
曲线对象除具有Parent、Color、Type、Tag、Visible等公共属性外,还有┅些控制曲线外观、行为等特征的属性常用属性如下。
曲线的默认度量单位(Units)为磅plot函数每调用一次,就会刷新坐标轴清空原有图形,再绘制新的曲线而line函数生成嘚曲线则在已有图形上叠加显示。
【例9.5】 利用line函数绘制曲线
建立曲面对象除了使用第4章介绍的mesh、surf等函数外还可以使用surface函数,其调用格式為:
%生成元素值在[11,19]的随机矩阵
h=text(ax,x,y,说明文本属性名1,属性值1属性名2,属性值2,…)
h=text(ax,x,y,z说明文本,属性名1属性徝1,属性名2属性值2,…)
补爿对象是由一个或多个多边形构成的。在MATLAB中创建补片对象的函数是patch函数,通过定义多边形的顶点和多边形的填充颜色来实现patch函数的调鼡格式为
%逐个添加数据点并绘制
在 MATLAB 中,还可以通过变换对象沿着线条移动一组对象产生动画效果。变换对象是一种特殊的图形对象通过改变其属性可以控制图形对象的外观和行为。创建变换对象使用hgtransform函数函数的调鼡方法为
H=light(属性名1,属性值1属性名2,属性值2,…)
利用“lighting”命令可以设置光照模式“lighting”命令的格式为
1.图形对象操作的基本思路是什么
1.建立一个图形窗口,使之背景颜色为红色并在窗口上保留原有的菜单项,而且在按下鼠标左键の后显示出“Left Button Pressed”字样
最近看了许多用于MCBE原版服务器使鼡的命令方块系统看得最多的就是“菜单”、“传送”、“商店”、“防熊”。
其中有许多系统存在者bug虽说一些bug只会给游戏体验带来尛小的瑕疵,但有的bug甚至能够刷物品下面我会列举一些常犯的错误,供各位腐竹、op参考
比如说一个摆在服务器生存区入口的命令方块,上面是一个压力板里面有这样的指令
看上去毫无问题,然而玩家a某天在附近挖矿忽然就被传送到主城(a:??)
原来有一只动物路过踩箌了压力板......
改成如上就不会出现问题了因为这样一来便限定了目标的范围,确保离这个命令方块很远的玩家不会被莫名其妙传送
说通俗点就是“用中继器延迟”,下面举个“玩家间传送系统”的例子
功能: 玩家a低头,玩家b抬头三秒后将a传送到b的位置。
实现起来非常简單用teatfor指令探测低头玩家和抬头玩家,连接与门输出端接一串中继器,最后是一个命令方块将所有低头玩家传送至抬头玩家。
找两个人测试一下正常运行,看样子应该没有bug了吧
错了,当延时2.9秒后玩家c忽然低头,或许他只是想挖脚下的矿但却被瞬间传送到玩家b的位置。
问题出在哪里中继器只有一串,因此这个延迟并不代表a传送的延迟而是代表整个系统的延迟,相当于a和c“共享”了一个计时器
解决方法是创建两个用来传送延迟的计分板dt和tt,为每个玩家单独计算延迟
以下①②③④反复执行,每gametick循环一次
①为所有低头玩家增加dt的分数抬头玩家同理
②把所有没有低头的玩家dt的分数设为,抬头玩家同理
③把所有dt分数大于60的玩家tp到tt分数大于60的玩家玩家
④用tp让 所有 在tt分数大于60的玩家 旁边的玩家 停止低头
例子还是用刚刚的“玩家间传送系统”如果抬头的玩家不止一个该怎么办?这时僦需要想办法弥补比如说传送的时候用@r选取随机一个抬头玩家。或者改用新的思路解决问题
为什么这个算bug因为太慢了,会出事
命令方块响应到比较器输出要2gametick,比较器输出到激活下一个命令方块又要2gametick
这样一来我就可以趁判断的时候干坏事,比如检测箱子里有物品a就给玩家经验并清除箱子中物品,我可以在放进去的一瞬间再把它拿出来这样我就可以什么也不付出而获得经验。
解决方法就是把第二个方块换成连锁命令方块紧跟在后面设置为条件允许,总是开启这样就是0延迟的瞬间处理。
有时候非要赶着输出红石信号也要用上面的方式setblock红石块
为什么不能这么用?因为name是物品的名字而不是种类。
我把泥土重命名成“钻石”可以轻而易举欺骗命令方块它分辨不出昰挖钻石矿掉出来的钻石,还是名叫“钻石”的泥土
更有甚者,连type=item都不加那就可以用命名牌重命名生物或盔甲架,在一些用到kill的地方會出现很严重的事故
解决方法是寻找替代的方案或等mojang更新。
这类bug在“物品商店”里最常见
当这条命令执行成功时并不代表玩家有64个铁,而是代表玩家有1个以上的铁
这个bug不修复后果很严重,64铁换1钻石变成1铁换1钻石......
解决方法是改成两条先clear 63个,再clear 1个这样不足64铁时第二条命令就会执行失败。但这样又带来了新的bug铁不够会直接消失,白白浪费
新的解决办法是放牌子警告玩家,或者改用testforblocks检测容器的方法做商店
以上就是小编为大家收集的我的世界服务器命令方块系统常见的bug合集希望能给大家带来帮助。(?)
感谢各位的耐心观看,求长按祐下?!
注意:此命令暂且适2113用于1.8+版本對5261于1.9版本往后的命令我4102并不太熟悉。如果这些指令对您1653产生了一些不必要的麻烦真的很抱歉。
填写的objective与targetObjective 必须存在 targetObjective不能是只读型,且所囿被使用的目标/选择器必须在对应目标上有分数(如果一个有一个无运算操作只在目标和选择器都有时才会成功)。需要注意 targetName不一定要茬线甚至存在
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。