目标:在设定的高度平面上显示等高线。
实现如下图所示的效果,在指定的高度(-40)上显示三维曲面和等高线的投影。
1.使用surfc函数,自带的投影等高线总是绘制在高度数据的最小高度平面上。并不能随用户指定绘制。如下图,等高线投影总是显示在(-25)的高度平面上。
2.在hold on的情况下,使用contour函数,得到的等高线图总是绘制在高度为0的高度平面上。如下图所示。
contour3()中获取的句柄,但是系统总是报错,说句柄的类型不对。总之,目前没有找到方法构建这样的句柄,或许通过修改原有的空间坐标系可以实现吧,也或许很麻烦。(如果有大佬知道了,恳求高抬贵手,救救我这个菜鸟的智商。)
最后,通过分析高度矩阵,干脆自己绘制等高线得了。使用函数plot3(x,y,z)(在某一个平面绘制图线)实现了灵活绘制等高线的需求。当然,对于绘制彩色的投影图,就没有这么复杂了,所以这里简述。
另外一个方面,如果需要美化,按照需求定制图像显示的模式和内容,也就是设置其他属性,比如标注、线条、文字、颜色等等,那么可以参照开发文档,绘图时候使用contour3(...,Name,Value),surf同理。
当然,还是建议使用句柄来设置,这样更灵活,比如技术文档中写的:
本来参照surf(X,Y,Z,C),想着contour3(contour)也会有这样的函数接口,可以在指定的高度面绘制等高线。但是并没有。所以方案迅速夭折。经过百般查询,扔未解决,只好用最原始的方法,找数据、分析数据、绘制等高线。
文档写的很清晰,还有例子,所以我也就不解释了。主要是分析c中的数据,构造自己需要的[网格数据]和[高度数据](这两个概念是借鉴的,能更好体现MATLAB绘制三维图形算法的本质,所以在此引用),然后使用plot3(Xdata,Ydata,Zdata)绘制即可。当然,每一条线都要绘制一次,所以这个[解析数据]的函数(代码如下,解析高度矩阵c,并绘制等高线)要写得具有通用性才行,算法很简单,分分钟就能写出来。或者直接看我的代码,也很容易理解。
cc = []; %记录每一次出现后的列数 if(c(1,ii) == -10 ) %设置寻找标志数据的条件,也可以设置为小于0,条件是通过观察数据得到的
第一,网格数据,往往是两个一维向量,然后可以通过meshgrid()函数构建MATLAB需要的标准的网格数据的格式。只是构建的时候需要注意一些方面。文档有提到。
当然也可能是二维矩阵,这个方面就不介绍了,文档有详细说明。
第二,三维数据中(x,y,z)中,往往x,y是自变量,z是因变量,当然,也有可能x是自变量,y,z都是因变量。初学者对这个还是要弄清楚的。
第三,上图比较粗糙,没有图例也没有坐标轴标识,等高线标识,时间有限,这些内容也很简单,所以略去了。
大佬们就没必要阅读此文了,本文可以给有功底的菜鸟提供一个解决方案,具体编程很简单,所以就不把代码贴出来了。若是有人需要我的代码,下载也无妨(在csdn下载资源中搜索本文章的名字即可找到)。