找回密码
 注册
Simdroid-非首页
查看: 196|回复: 8

meshc等高线位置如何调整

[复制链接]
发表于 2009-6-17 16:20:46 | 显示全部楼层 |阅读模式 来自 香港
本帖最后由 ljelly 于 2009-6-18 10:07 编辑

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

多谢!
发表于 2009-6-17 17:13:44 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
利用axis命令来限制一下坐标轴的范围就可以了,
具体help axis
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-17 22:58:39 | 显示全部楼层 来自 香港
本帖最后由 siuchun 于 2009-6-17 23:00 编辑

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

使用道具 举报

发表于 2009-6-17 23:47:32 | 显示全部楼层 来自 辽宁大连
这个应该可以通过修改z坐标来实现把,例如以前你的模型在(X,Y,-400)处,现在
可以用(X,Y,-600)来画,不知道这样时候可以满足你的要求。
回复 不支持

使用道具 举报

发表于 2009-6-18 00:03:27 | 显示全部楼层 来自 新疆乌鲁木齐
本帖最后由 bainhome 于 2009-6-18 00:05 编辑

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

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 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函数完成
  1. NewZdata = cellfun(@(x) x*(-8)/zdata{1}(1),zdata, 'UniformOutput',false);
复制代码
完了之后用一个for循环set各个h

  1. for k = 1:length(h)-1
  2. set(h(k+1),'zdata',NewZdata{k});
  3. end
复制代码
至此就OK了

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-6-18 02:39:38 | 显示全部楼层 来自 新疆乌鲁木齐
其实看看meshc最后几行代码能够发现,meshc的原作者想法和rocwoods基本上完全相同,也是通过循环遍历所有等值线句柄实现的,所以我们思路上讲都是一样的。
  1. [cc,hh] = contour3(cax,x,y,z); %#ok

  2. %%% size zpos to match the data

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

  7. if ~hold_state, set(cax,'NextPlot',next); end
  8. if nargout > 0
  9.     h = [hm; hh(:)];
  10. end
复制代码
你俩一个为创建、一个为修改。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-18 12:46:41 | 显示全部楼层 来自 香港
多谢各位的详细指导说明, 学习了很多,呵呵

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

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-9-6 13:55:28 | 显示全部楼层 来自 大连理工大学
学习了,这种回帖含金量太大了,不仅告诉怎么做,直接查找的思路都有,这才是学会学习啊,受教了。。。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-27 20:48 , Processed in 0.060619 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表