二维三维动画版心形线附代码

前言

心形线,是外摆线的一种,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名。其极坐标的方程为: r = a ( 1 − s i n θ ) r =a( 1 - sin θ) r=a(1sinθ)
下面将分别用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网站下载学习。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值