siuchun 发表于 2009-6-17 16:20:46

meshc等高线位置如何调整

本帖最后由 ljelly 于 2009-6-18 10:07 编辑

用matlab里面的surfc或meshc命令绘制的三维图形时,等高线所在的投影面是计算机默认的平面。如何让等高线落在一指定平面?

多谢!

zhoulon 发表于 2009-6-17 17:13:44

利用axis命令来限制一下坐标轴的范围就可以了,
具体help axis

siuchun 发表于 2009-6-17 22:58:39

本帖最后由 siuchun 于 2009-6-17 23:00 编辑

多谢答复, 这个用过了, 先从图中观察得出的默认等高线的平面位置,然后把axis中的最小值取这个值. 但如下图所示, 默认等高线在Z=-400的平面上, 设置axis, z的坐标范围为[-600,200]我想让等高线落在z=-600的平面上, 但结果等高线还是在z=-400的平面上, 应该怎样处理呢?http://home.simwe.com/attachment/200906/17/356196_12452504050xk2.jpg

zhoulon 发表于 2009-6-17 23:47:32

这个应该可以通过修改z坐标来实现把,例如以前你的模型在(X,Y,-400)处,现在
可以用(X,Y,-600)来画,不知道这样时候可以满足你的要求。

bainhome 发表于 2009-6-18 00:03:27

本帖最后由 bainhome 于 2009-6-18 00:05 编辑

这种问题转换一下思路就可以很简单地解决——尽管很久没正式碰过MATLAB了...:victory:
看help中这个例子: = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc(X,Y,Z);
axis([-3 3 -3 3 -10 5])
图形绘制完成之后等值线处于z=-10的位置,那么想改变其具体位置,则需要了解meshc的运作原理,在命令窗口敲:edit meshc可以发现与预想完全相同——所谓的meshc只不过就是mesh+contour3的命令集合,既然如此,调整contour3的绘制水平位置就可以圆满解决此问题,在line 64加断点调试,运行上述代码发现workspace中出现了line 59代码:a = get(cax,'zlim');的运行结果:a=[-10,10];原来contour3的绘制秘密就在与此,那么只要将meshc的所有命令另存一个新M文件meshc_bainhome.m,然后在这个新的meshc文件中将上述代码改为:a = 2*get(cax,'zlim');再运行如下代码: = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc_bainhome(X,Y,Z);
axis([-3 3 -3 3 -20 5])
看看什么结果?其他我想可以不用再所说了。应该也有其他方法,比如寻找contour3的句柄然后hgtransform做平移变换、或者干脆自己写一个mesh+contour3的代码即可(这个我几年前写过,可惜找不到了)

rocwoods 发表于 2009-6-18 00:55:40

本帖最后由 rocwoods 于 2009-6-18 01:00 编辑

说说我看到这个问题的解决思路吧。首先我doc meshc看meshc的帮助文档
发现 Syntax里有这么一行 h = mesh(...) ,接下来看下面的Description
h = mesh(...), h = meshc(...), and h = meshz(...) return a handle to a surfaceplot graphics object.
噢,原来h返回的是surfaceplot graphics object的句柄,那么h里一定包含了等高线的句柄。接下来运行get(h,'type')发现h(2:end)类型一样,都是等高线句柄。
既然知道了等高线的句柄,那么就可以用set函数设置它的'zdata'属性来改变位置了。

首先,zdata = get(h(2:end),'zdata')得到一个cell数组,里面包含了各个等高线的zdata值,这些都是一样的。zdata{1}(1)即是现在等高线投影面的z值,假如想设为新的值z0 = -8;我们只要让zdata里每一个单元都乘以(z0/zdata{1}(1))就可以了。由于zdata是cell数据,可以用cellfun函数完成NewZdata = cellfun(@(x) x*(-8)/zdata{1}(1),zdata, 'UniformOutput',false); 完了之后用一个for循环set各个h
for k = 1:length(h)-1
set(h(k+1),'zdata',NewZdata{k});
end
至此就OK了

bainhome 发表于 2009-6-18 02:39:38

其实看看meshc最后几行代码能够发现,meshc的原作者想法和rocwoods基本上完全相同,也是通过循环遍历所有等值线句柄实现的,所以我们思路上讲都是一样的。 = contour3(cax,x,y,z); %#ok

%%% size zpos to match the data

for i = 1:length(hh)
    zz = get(hh(i),'Zdata');
    set(hh(i),'Zdata',zpos*ones(size(zz)));
end

if ~hold_state, set(cax,'NextPlot',next); end
if nargout > 0
    h = ;
end你俩一个为创建、一个为修改。

siuchun 发表于 2009-6-18 12:46:41

多谢各位的详细指导说明, 学习了很多,呵呵

我试了下,将meshc中代码 zpos = a(1) 这一行中的a(1)值直接用我要的平面值代替就好像可以达到目的了.

Qba 发表于 2011-9-6 13:55:28

学习了,这种回帖含金量太大了,不仅告诉怎么做,直接查找的思路都有,这才是学会学习啊,受教了。。。
页: [1]
查看完整版本: meshc等高线位置如何调整