回 帖 发 新 帖 刷新版面

主题:土问:如何画三维模型的色温图

我的数据文件如附件,最顶上的数是我数据的个数总数,第一列为数据编号,第二列维模型的x坐标,第三列为模型的y坐标,第四列为模型的z坐标,第五列维相应(x,y,z)坐标点处的函数值。我的程序如下:
fid=fopen('E:\emhybrid\program\FEM\Result\temperature.res','r');
number=fscanf(fid,'%4d',1);
x = zeros(number,1);
y = zeros(number,1);
z = zeros(number,1);
value = zeros(number,1);
for n=1:number
    num(n)=fscanf(fid,'%4d',1);
    x(n)=fscanf(fid,'%25e',1);
    y(n)=fscanf(fid,'%25e',1);
    z(n)=fscanf(fid,'%25e',1);
    value(n)=fscanf(fid,'%25e',1);
end
 
surf(x',y',z',value);
colormap hsv

但是走到surf就出错了,即使换成mesh也是出错。

[b]以下为更新:[/b]

[b]temperature.res文件里的数据格式如下:[/b]
%总共的节点个数
1453
%数据的节点编号  x坐标   y坐标   z坐标       空间(x,y,x)点处的函数值,如温度
1   2.5000E-01  5.0000E+00  2.2000E+00      4.9907E+02
2   0.0000E+00  2.5000E+00  2.2000E+00      4.9182E+02

[b]注:[/b]
其实我就是要算一个三维空间物体模型的热传导,将三维物体模型离散化成节点,按照节点编号,将其的坐标给出,最后计算出各个空间节点出的温度分布,依然按照空间节点顺序依次给出如temperature.res文件所示。用商业软件画出的色温结果图形如附件图右所示,我算出的结果就是temperature.res文件,用matlab画出来如附件图左所示。我就是需要用temperature.res文件里的数据画出图左的东西。

[b]我遇到的问题如下:[/b]
1. 前人用fortran计算的temperature.res文件数据结果,然后 通过fortran调用的matlab引擎。我有它这段程序,可是不能程序运行到调用matlab引擎时就失败,以致后面的画图程序没有办法运行。

2. 我想前人也是通过matlab引擎来画的这种三维的色温图,那么也可以直接用matlab画出来它,所以寻求在得到计算结果的时候,直接用matlab来画这种图。

所以我要是可以解决以上其中任何一个问题就行,以我目前的matlab水平,同时身边没有人做这个东西,也么有人搞matlab,让我觉得这个比较难,我翻了不少书还有去清华和浙大的bbs求救了,可惜还是没有什么太大的帮助。

回复列表 (共6个回复)

沙发

你这里说的不是三维图的了,而是属于四维图
用surf和mesh当然不行
另外即使三维的,你里面的x,y不能直接做surf的参数,还得要用meshgrid命令转成网格数据
对于四维的可以用切片图表现,用slicc,格式在帮助里有
SLICE  Volumetric slice plot.
    SLICE(X,Y,Z,V,Sx,Sy,Sz) draws slices along the x,y,z directions at
    the points in the vectors Sx,Sy,Sz. The arrays X,Y,Z define the
    coordinates for V and must be monotonic and 3-D plaid (as if
    produced by MESHGRID).  The color at each point will be determined
    by 3-D interpolation into the volume V.  V must be an M-by-N-by-P
    volume array. 
 
    SLICE(X,Y,Z,V,XI,YI,ZI) draws slices through the volume V along the
    surface defined by the arrays XI,YI,ZI.

板凳

恩,是啊,是属于四维的数据图,总的说下来就是三位模型上加上色温图来表达这个四维模型的,我现在也找到slicc这个命令了,直前也试过,说我的数据超出了它允许的范围。
matlab还不是很熟,再研究一下,有进展来汇报。
不过要是那位兄台画过这种东东,请指教一下,万分感谢啊~~~~呵呵



[quote]你这里说的不是三维图的了,而是属于四维图
用surf和mesh当然不行
另外即使三维的,你里面的x,y不能直接做surf的参数,还得要用meshgrid命令转成网格数据
对于四维的可以用切片图表现,用slicc,格式在帮助里有
[/quote]

3 楼

我没看到你的数据附件什么的,也就不知道为什么出现你说的情况,所以随便举个例子,希望对你有用
[x,y,z]=meshgrid(-2:0.2:2,-2:0.2:2,-2:0.2:2);
v=sqrt(x.*x+y.*y+z.*z);
slice(x,y,z,v,[-1.2 0 2],[0 2],[-2 0])
colorbar('horiz')

结果图我不知道怎么放到这里来,不过这段程序我是在matlab7上实现过了,应该没问题,如果你知道怎么在这个论坛上贴图片和上传附件的方法也顺便教下我,先谢了。

4 楼

非常感谢你,我的数据应该不能直接用slice,因为我的数据是按照节点编号顺序给出的不是按照节点坐标的单调递增或者递减来给出的。相应的我在原帖里进行了稍微详细的介绍。不过估计最后还是要用slice来完成,我只好下来再慢慢琢磨了。

另,结果图没有办法在回帖中展示出来,本版的那个上穿文件的通道还没开通(刚才实验了下),所以我也只好在原帖里进行贴图阐述。

anyway,还是非常感谢你的回复,谢谢~



[quote]我没看到你的数据附件什么的,也就不知道为什么出现你说的情况,所以随便举个例子,希望对你有用
[x,y,z]=meshgrid(-2:0.2:2,-2:0.2:2,-2:0.2:2);
v=sqrt(x.*x+y.*y+z.*z);
slice(x,y,z,v,[-1.2 0 2],[0 2],[-2 0])
colorbar('horiz')

结果图我不知道怎么放到这里来,不过这段程序我是在matlab7上实现过了,应该没问题,如果你知道怎么在这个论坛上贴图片和上传附件的方法也顺便教下我,先谢了。

[/quote]

5 楼

原来这样,是啊,实验室出来的数据多是这种形式,而matlab很多函数偏偏就要方阵型,多么不方便。不过可以用拟合的方法利用原来的数据拟合出这种方阵坐标的形式的数据,二维坐标的可以用griddata,而三维的似乎没有专门函数,但用bp神经网络能很方便拟合出来,然后再用meshgrid,网格化后就可以用slice了。

6 楼

哇,好吧,ms比价复杂,我自己再捉摸下先。

我来回复

您尚未登录,请登录后再回复。点此登录或注册