前言
心形线,是外摆线的一种,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名。其极坐标的方程为:
r
=
a
(
1
−
s
i
n
θ
)
r =a( 1 - sin θ)
r=a(1−sinθ)
下面将分别用C++, Python,Matlab语言画图,和三维动画。
二维图
1. 极坐标
clear
clc
x = 0:0.001:2*pi;
y = 1 + cos(x);
polar(x, y, 'r');
view(90,90)
2. 简易动画
%画心形线;
% function cupid %丘比特;
clear all
close all
clc
h1=figure('name','爱的表达');
% %
set(gcf,'outerposition',get(0,'screensize'));
axis([-1.5 1.5 -2 0.5]);
axis off;
set(gcf,'color','black');
n=4;
a=320;
m=10^(-a);
h11=line(NaN,NaN,'marker','.','linesty','-','erasemode','none','color','r');
x1=[];
y1=[];
for theta=pi/2:-2*pi/999:-3*pi/2
r1=1+cos(theta+pi/2);
x1=[x1;r1*cos(theta)];
y1=[y1;r1*sin(theta)];
set(h11,'xdata',x1,'ydata',y1);
pause(m);
end
pause(0.61); %%%%%%%%%%%
fill(x1,y1,'r');
axis off;
set(gcf,'color','black');
text(-0.16*n,-0.85,'数学','fontsize',n*18,'color','b');
title('心形线','fontsize',18,'color','m'); disp('love you');
pause(1);
x2=[];
y2=[];
h22=line(NaN,NaN,'marker','.','linesty','-','erasemode','none','color','b');
for theta=pi/2:-2*pi/999:-3*pi/2
r2=1+cos(theta+pi/2);
x2=[x2;r2*cos(theta)];
y2=[y2;r2*sin(theta)];
set(h22,'xdata',x2,'ydata',y2);
pause(m^19)
end
h2=figure('name','爱的表达');
% %
set(gcf,'outerposition',get(0,'screensize'));
fill(x2,y2,'r');
text(-0.58,-0.7,'我爱你','fontsize',40,'color','b');
text(-0.17,-1.1,'数学','fontsize',18,'color','k');
title('心形线','fontsize',18,'color','m');
axis off; set(gcf,'color','black');
pause(1)
x3=[];
y3=[];
h33=line(NaN,NaN,'marker','.','linesty','-','erasemode','none','color','b');
for theta=pi/2:-2*pi/999:-3*pi/2
%999一片真心;
r3=1+cos(theta+pi/2);
x3=[x3;r3*cos(theta)];
y3=[y3;r3*sin(theta)];
set(h33,'xdata',x3,'ydata',y3);
pause(m^19);
end
3. Python文字填充
s = "Happy birthday "
for y in [i/100.0 for i in range(130, -116, -6)]:
line, index = [], 0
for x in [i/1000.0 for i in range(-1200, 1225, 25)]:
if pow((x*x+y*y-1.0), 3) - x*x*y*y*y <= 0.0:
line.append(s[index % len(s)])
index = index + 1
else:
line.append(" ")
print("".join(line))
4. C++方程一之"*"填充
#include <iostream>
#include <cmath>
using namespace std;
// Function
// (x^2+y^2-1)^3 - x^2*y^3 = 0
// y ~ (-1.1 , 1.3 )
// x ~ (-1.2 , 1.2 )
int main()
{
for(float y = 1.3 ; y >= -1.1 ; y -= 0.06 )
{
for(float x = -1.2 ; x <= 1.2 ; x += 0.025 )
if(pow((x*x+y*y-1.0),3) - x*x*y*y*y <= 0.0 )
cout<<'*';
else
cout<<' ';
cout<<endl;
}
return 0;
}
5. C++方程一之反向填充
#include <iostream>
#include <cmath>
using namespace std;
// Function
// (x^2+y^2-1)^3 - x^2*y^3 = 0
// y ~ (-1.1 , 1.3 )
// x ~ (-1.2 , 1.2 )
int main()
{
for(float y = 1.3 ; y >= -1.1 ; y -= 0.06 )
{
for(float x = -1.2 ; x <= 1.2 ; x += 0.025 )
if( pow((x*x+y*y-1.0),3) - x*x*y*y*y <= 0.0 )
cout<<' ';
else
cout<<'$';
cout<<endl;
}
return 0;
}
6. C++直角坐标系之方程二
#include <iostream>
#include <cmath>
using namespace std;
// Function
// x^2 + (5.0*y/4.0-sqrt(|x|))^2 = 1
// y ~ (-1.1 , 1.3 )
// x ~ (-1.1 , 1.1 )
int main()
{
for(float y = 1.3 ; y >= -1.1 ; y -= 0.06 )
{
for(float x = -1.1 ; x <= 1.1 ; x += 0.025 )
if( x*x + pow(5.0*y/4.0-sqrt(fabs(x)),2) - 1 <= 0.0 )
cout<<'*';
else
cout<<' ';
cout<<endl;
}
return 0;
}
三维动画
此三维动画是在大学时参加数学建模培训时整理留存的,用的是Matlab语言实现,代码如下:
代码
clear
clc
%构造体积方程和坐标轴,画出图形;
[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),'r');
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),'r');
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,'r');
end
zData = iZ.*ones(1,cData(2,startIndex));
plot3(hAxes,cData(1,(startIndex+1):end),...
cData(2,(startIndex+1):end),zData,'r');
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,'You', '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 鬼魂 2020/10/14', 'fontsize',8)
text(35,45,30,'', 'fontsize',8)
图示
总结
以上代码以及更多类似变化的代码均可以去我的GitHub网站下载学习。