%
% 微小ダイポールの電気力線のアニメーション
% http://www.takuichi.net/hobby/edu/em/smalldipole/smalldipole-j.html
% 
% MATLAB R2015a
% 2016/7/25 Copyright (c) Takuichi Hirano
%
function infinitesimal_dipole
    ci=complex(0,1);    % 虚数単位i
    eps0=8.854e-12;     % 真空の誘電率
    mu0=4.*pi.*1e-7;    % 真空の透磁率
    c=2.99792458e8;     % 光速

    lambda0=1.;         % 波長
    freq=c./lambda0;    % 周波数
    omega=2.*pi.*freq;  % 角周波数
    T=1./freq;          % 周期

    %----------------
    % 描画・動画パラメータ
    canvas_scale=1;     % 描画領域サイズのスケール(1: 画面サイズいっぱい)
    nframe=16;          % 1周期のフレーム数
    nrepeat=10;         % 動画の繰り返し回数

    avi_frate=2;        % フレーム レート (1 秒あたりに表示するフレームの数) 
    avi_quality=70;     % 画質設定 (0 から 100 までのパーセント値)
    avi_nrep=3;         % AVIファイル出力時の動画繰り返し回数
    %----------------

    k0=omega.*sqrt(eps0.*mu0);  % 自由空間の波数
    eta0=sqrt(mu0./eps0);       % 自由空間の界インピーダンス

    % 関数定義: R
    R=@(X,Z) k0.*sqrt(X.^2+Z.^2);

    % グラフィックを描画
    scrsz = get(groot,'ScreenSize');    % 画面サイズの取得
    canvas_width=(min(scrsz(3),scrsz(4)))*canvas_scale;
    canvas_height=(min(scrsz(3),scrsz(4)))*canvas_scale;
    font_size=(canvas_width/800)*12;   % フォントサイズ
    fig=figure('Position',[(scrsz(3)/2-canvas_width/2) (scrsz(4)/2-canvas_height/2) canvas_width canvas_height]);

    xmin=-2.0;
    xmax= 2.0;
    x=linspace(xmin,xmax,200);
    zmin=-2.0;
    zmax= 2.0;
    z=linspace(zmin,zmax,200);
    [X,Z]=meshgrid(x,z);

    for i=1:nframe
        clf;        % 現在のFigureウィンドウをクリア
        t = omega.*(((T./2)./nframe).*(i-1));

        F = (cos(t - R(X,Z)) + sin(t - R(X,Z))./R(X,Z)).*((X./R(X,Z)).^2);

        %--------
        % Figure
        [C,h]=contour(X,Z,F,[-0.1:0.005:0.1]);       % グラフを描画
        set(h,'LevelStepMode','manual');
        set(h,'Color','k');
        axis tight;                     % データの範囲と描画範囲を一致させる
        zlim([-0.1 0.1]);
        xlabel({'x (wavelength)'});         % xlabel を作成
        ylabel({'z (wavelength)'});         % ylabel を作成
        title({'Infinitesimal Dipole'});    % title を作成

        set(gca,'FontSize',font_size);      % フォントサイズ設定
        drawnow
        frm(i)=getframe(gcf);
    end
    movie(fig,frm,10);                  % 動画の再生(最後の引数は繰り返し回数)
    
    % 動画のファイル保存
    v = VideoWriter('inf_dip.avi');
    v.FrameRate = avi_frate;    % Default 30
    v.Quality = avi_quality;    % Default 75
    open(v);
    for k=1:avi_nrep
        for i=1:nframe
            writeVideo(v,frm(i));
        end
    end
    close(v);
end


