在一些网站上看到了有人说起了关于伟大法国数学家笛卡尔的事情(第一个发现了直角坐标系),因为很有兴趣,便深挖了一下,关于他有一个和克丽丝汀公主很浪漫但是也很悲伤的事,传闻他在死之前,因为极其思恋那位美丽的公主,寄给了她第13封信,一个有关极坐标的函数 r=a(1-sinθ) 。公主由于对数学的极大兴趣,很快便解出了这个迷,用的就是直角坐标图
当θ=0°时,r=a(1-0)=a …… A点
当θ=90°时,r=a(1-1)=0 …… B点
当θ=180°时,r=a(1-0)=a …… C点
当θ=270°时, r=a(1+1)=2a …… D点
这第13封的另类情书还保留在欧洲的迪卡儿纪念馆里。
原版的情书:
这个就是函数 r=a(1-sinθ) 的Matlab实现,是一个简单的2D图。在学了一二个月的MATLAB后,就像着希望能够画出这个心形图的3D版,也找了一些资料,然后发现已经有高人用MATHMATICAL画出了,但是并没有代码。图就不放出来了。但是自己怎么努力也没画出一个很好看的3D心型图。然后在外文网站上找到一个类似的代码,只经过一些简单的修改。终于完成了Matlab3D的实现。代码如下:
%构造体积方程和坐标轴,画出图形;
[X,Y,Z] = meshgrid(linspace(-3,3,101));
%3D心型图方程如下;
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