立即注册 登录
气象家园 返回首页

婧女其姝rat的个人空间 http://bbs.06climate.com/?1438 [收藏] [复制] [分享] [RSS]

日志

一生只为此函数(MATLAB7.0构造3D心型图)

热度 4已有 1519 次阅读2012-12-16 16:32

在一些网站上看到了有人说起了关于伟大法国数学家笛卡尔的事情(第一个发现了直角坐标系),因为很有兴趣,便深挖了一下,关于他有一个和克丽丝汀公主很浪漫但是也很悲伤的事,传闻他在死之前,因为极其思恋那位美丽的公主,寄给了她第13封信,一个有关极坐标的函数 r=a(1-sinθ) 。公主由于对数学的极大兴趣,很快便解出了这个迷,用的就是直角坐标图
θ时,ra(10)a …… A
θ90°时,ra(11)0 …… B
θ180°时,ra(10)a …… C
θ270°时, ra(11)2a …… D

这第13封的另类情书还保留在欧洲的迪卡儿纪念馆里。

原版的情书:

一生只为此函数(MATLAB7.0构造3D心型图)

这个就是函数 r=a(1-sinθ) 的Matlab实现,是一个简单的2D图。在学了一二个月的MATLAB后,就像着希望能够画出这个心形图的3D版,也找了一些资料,然后发现已经有高人用MATHMATICAL画出了,但是并没有代码。图就不放出来了。但是自己怎么努力也没画出一个很好看的3D心型图。然后在外文网站上找到一个类似的代码,只经过一些简单的修改。终于完成了Matlab3D的实现。代码如下:

%构造体积方程和坐标轴,画出图形;
[X,Y,Z] = meshgrid(linspace(-3,3,101));

=心型图方程如下;
F = -X.^2.*Z.^3-(9/80).*Y.^2.*Z.^3+(X.^2+(9/4).*Y.^2+Z.^2-1).^3;
hFigure = figure;
sz = get(hFigure, 'Position');
set(hFigure, 'Position', [sz(1)-0.15*sz(3) sz(2) 1.3*sz(3) sz(4)]);
set(hFigure,'color','w', 'menu','none')

hAxes = axes('Parent',hFigure,'NextPlot','add',...
'DataAspectRatio',[1 1 1],...
'XLim',[30 120],'YLim',[35 65],'ZLim',[30 75]);
view([-39 30]);
axis off

% 制作出动态的隐形效果;

hidden on

% 画出网格,制作网格动态效果;

% 快渲染心得背面:

p = patch(isosurface(F,-0.001));
set(p,'FaceColor','w','EdgeColor','w');

% 构造Y-Z平面,,描完函数在该平面的点:
for iX = [35 38 41 45 48 51 54 57 61 64 67]
plane = reshape(F(:,iX,:),101,101);
cData = contourc(plane,[0 0]);
xData = iX.*ones(1,cData(2,1));
plot3(hAxes,xData,cData(2,2:end),cData(1,2:end),'k');
pause(.1), drawnow
end

% 构造X-Z平面,描完函数在该平面的点:
for iY = [41 44 47 51 55 58 61]
plane = reshape(F(iY,:,:),101,101);
cData = contourc(plane,[0 0]);
yData = iY.*ones(1,cData(2,1));
plot3(hAxes,cData(2,2:end),yData,cData(1,2:end),'k');
pause(.1), drawnow
end

% 构造X-Y平面,描完函数在该平面的点:
for iZ = [36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 69 71]
plane = F(:,:,iZ);
cData = contourc(plane,[0 0]);
startIndex = 1;
if size(cData,2) > (cData(2,1)+1)
startIndex = cData(2,1)+2;
zData = iZ.*ones(1,cData(2,1));
plot3(hAxes,cData(1,2:(startIndex-1)),...
cData(2,2:(startIndex-1)),zData,'k');
end
zData = iZ.*ones(1,cData(2,startIndex));
plot3(hAxes,cData(1,(startIndex+1):end),...
cData(2,(startIndex+1):end),zData,'k');
pause(.1), drawnow
end

%函数已经画完,接下来为文字部分;
pause(.2)

%设置字体大小,粗细,位置等,以下是打出I (心型图) Wendy;

text(7,50,70,'I', 'fontWeight','bold','FontAngle','italic','fontsize',60)
pause(.5)
text(80,50,43,'Wendy', 'fontWeight','bold','FontAngle','italic','fontsize',60)
pause(.2)

line([20 80],[50 50],[52.5 52.5], 'color','w')
line([50 50],[20 80],[52.5 52.5], 'color','w')
line([50 50],[50 50],[30 80], 'color','w')

%制作者签名;
text(40,60,30,'Made By Chey 12/24/2010', 'fontsize',8)
text(35,45,30,'', 'fontsize',8)

到此,心型图3D版画完,画完后的效果如下


虽然大部分的工作不是我所做的,但是找完这个代码,给女朋友看完之后也确实满足了一下我小小的虚荣心。

很多女生都闲学IT的都是木头,我想,如果用这种方法去表达爱意的话,会比较有心意吧。而且好歹也将学到的东西用上了。只要添加或改动Text里面的字,就可以把想说的话表达出来啦。

text(7,50,70,'I', 'fontWeight','bold','FontAngle','italic','fontsize',60)
pause(.5)
text(80,50,43,'Wendy', 'fontWeight','bold','FontAngle','italic','fontsize',60)

说出你想说的话,IT男们也能有机会追求自己的幸福。

外文网站资料:http://stackoverflow.com/questions/1526898/how-do-i-reproduce-this-heart-shaped-mesh-in-matlab

发表评论 评论 (4 个评论)

回复 霞光向日葵 2012-12-17 15:50
居然没有要说点什么的人??惊叹……
回复 Lorenz混沌 2012-12-19 12:07
真强悍,理科生的爱情可真特别!
回复 小草 2012-12-28 14:13
真浪漫,女朋友肯定很幸福吧。我拷了代码也画出来了,呵呵。
回复 齐齐 2012-12-29 08:55
很强悍,也很浪漫O(∩_∩)O~

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

返回顶部