荷電π中間子...GIF動画

原子核内で陽子と陽子が電磁力の反発力で壊れないのは、核子間で核力(強い力)が働くからだそうです。 核力はπ中間子を介し、荷電π中間子だと陽子は中性子に、中性子は陽子になりますが、 中性π中間子だと陽子・中性子はそのままです。

Win64版Matlab R2013aだとgetframe(gcf)そのままだと、キャプチャされた画像は更新されませんでした。 やむを得ず、figureを作成しては消去しての繰り返しで、キャプチャされた画像の更新を行うことにしてます。

close all;clear;
ang=30/180*pi;
N=30;
NN=ones(N+1,N+1);
[x,y,z]=sphere(N);
a=3^0.5;b=(8/3)^0.5;aa=2.5;ab=2;
GIF=2;% GIF==0だと動画は作成されない。
switch GIF
    case 0;seg=72;
    case 1;seg=72;fname='pion.gif';
    case 2;seg=36;
end;
proton='$$p^{+}$$';
neutron='$$n^{0}$$';
posipi='$$\pi^{+}$$';
negapi='$$\pi^{-}$$';
uud1='$$\textcolor{red}u \textcolor{blue}{u}$$';
T=linspace(0,4*pi,seg+1);
w=0.7;
for t=1:seg
    kk=[-3,0,0;-2,0,0;-3,1,0;...
    3,-2,0;2,-2,0;3,-3,0;...
    0,-0.5,0;0,-1.5,0];
    X=[cos(ang),sin(ang),0;-sin(ang),cos(ang),0;0,0,1];
    dx=[2,0,0]*X;
    dy=[1,a,0]*X;
    dz=[1,1/a,b]*X;% 今回は使わず
    k=zeros(size(kk,1),3);
    for n=1:size(kk,1)
        k(n,:)=kk(n,1)*dx+kk(n,2)*dy;
    end;
    tx=-cos(T(t))*2.5;
    if T(t)>2*pi
        tx=-tx;
    end;
    k(7:8,1)=k(7:8,1)+tx;
    mk1=mean(k(1:3,:));
    mk2=mean(k(4:6,:));
    mk3=mean(k(7:8,:));
    switch GIF
        case 0;
            if t==1;
                figure('color',[1,1,1],'InvertHardCopy','off');
            else
                cla;
            end;
        case 1;
            close(gcf);
            figure('color',[1,1,1],'InvertHardCopy','off');
        case 2;
            if t==1
                figure('color',[1,1,1],'InvertHardCopy','off');
                set(gcf,'position',[50,50,800,600]);
            end;
            subplot('position',[mod(t-1,6)/6+0.05,(5-floor((t-1)/6))/6,1/6-0.1,1/6]);
    end;
    for n=1:size(k,1)
        surface(x+(k(n,1))*NN,y+k(n,2)*NN,z+k(n,3)*NN,...
                'tag','q');
        if n==1;hold on;end;
    end;
    hq=findobj(gca,'tag','q');
    hq=flipud(hq);
    set(hq,'edgecolor','none');
    set(hq([1,4]),'facecolor',[0,0,1]);
    set(hq([2,5]),'facecolor',[0,1,0]);
    set(hq([3,6]),'facecolor',[1,0,0]);
    set(hq(7),'facecolor',[0,1,0]);
    set(hq(8),'facecolor',[1,0,1]);
    hN1=surface(aa*x+mk1(1),aa*y+mk1(2),aa*z+mk1(3),...
        'facecolor',[0,0,1],'facealpha',0.2,'edgecolor','none','tag','N1');
    hN2=surface(aa*x+mk2(1),aa*y+mk2(2),aa*z+mk2(3),...
        'facecolor',[0,0,1],'facealpha',0.2,'edgecolor','none','tag','N2');
    hN3=surface(ab*x+mk3(1),ab*y+mk3(2),ab*z+mk3(3),...
        'facecolor',[1,0,0],'facealpha',0.2','edgecolor','none','tag','N3');
    tx1=text(mk1(1),2,0,'$$ $$','FontSize',30,'interpreter','latex');
    tx2=text(mk2(1),2,0,'$$ $$','FontSize',30,'interpreter','latex');
    tx3=text(mk3(1),2,0,'$$ $$','FontSize',30,'interpreter','latex');
    for n=1:size(k,1)
        hqrk(n)=text(k(n,1),k(n,2),k(n,3),'$$u$$','interpreter','latex','FontSize',25,'color',[1,1,1]);
    end;
    set(hqrk([3,6]),'string','$$d$$');
    set(hqrk(7:8),'visible','off');
    axis off;
    set(gca,'CameraViewAngle',6);
    if T(t)<=2*pi
        set(hqrk([2,5]),'string','$$d$$');
        if tx<-2
            set(hN1,'facecolor',[1,0,0]);
            set([hN3;hq(7:8)],'visible','off');
            set(tx1,'string',proton);
            set(tx2,'string',neutron);
            set(hqrk(2),'string','$$u$$');
        elseif tx>2
            set(hN2,'facecolor',[1,0,0]);
            set([hN3;hq(7:8)],'visible','off');
            set(tx2,'string',proton);
            set(tx1,'string',neutron);
            set(hqrk(5),'string','$$u$$');
        else
            set(tx1,'string',neutron);
            set(tx2,'string',neutron);
            set(tx3,'string',posipi);
            set(hqrk,'visible','on');
            set(hqrk(8),'string','$$\bar{d}$$');
        end;
    else
        if tx<-2
            set(hN2,'facecolor',[1,0,0]);
            set([hN3;hq(7:8)],'visible','off');
            set(tx2,'string',proton);
            set(tx1,'string',neutron);
            set(hqrk(2),'string','$$d$$');
        elseif tx>2
            set(hN1,'facecolor',[1,0,0]);
            set([hN3;hq(7:8)],'visible','off');
            set(tx1,'string',proton);
            set(tx2,'string',neutron);
            set(hqrk(5),'string','$$d$$');
        else
            set([hN1;hN2],'facecolor',[1,0,0]);
            set(hN3,'facecolor',[0,1,1]);
            set(tx1,'string',proton);
            set(tx2,'string',proton);
            set(tx3,'string',negapi);
            set(hqrk(7:8),'visible','on');
            set(hqrk(7),'string','$$d$$');
            set(hqrk(8),'string','$$\bar{u}$$');
        end;
    end;
    light('position',100*[1,1,1]);
    light('position',-100*[1,1,1]);
    daspect([1,1,1]);
    switch GIF
        case 0;
            pause(0.2);
            drawnow;
        case 1;
            F=getframe(gcf);
            [fc,fm]=rgb2ind(F.cdata,256);
            if t==1
                imwrite(fc,fm,fname,'loopcount',inf,'delaytime',0);
            else
                imwrite(fc,fm,fname,'writemode','append','delaytime',0);
            end;
        case 2;
            set(gca,'CameraViewAngle',4);
            set(hqrk,'FontSize',15);
            set([tx1,tx2,tx3],'FontSize',18);
    end;
end;
rotate3d on;