手書き PostScript で重力レンズ

質点が作る重力レンズが白丸の手前を通過した時どう見えるか。白丸の手前を通る重力レンズ
市松模様の手前を通過した時どう見えるか。市松模様の手前を通る重力レンズ
以下ソース

%!PS
%%BoundingBox: 0 0 100 100
gsave
% アインシュタイン半径
/θE 25.0 def
% 曲がり角の発散回避のために、除算の前に足しておく数
/EPS 0.01 def
% レンズの初期位置
/θ0 [0 45] def
% レンズの移動速度
/dθ [1 0] def
% θI の方向から来た光が、背景のどの位置から出たか計算する
/θItoθs {
    2 dict begin
    /θ0 exch def
    /θI exch def
    % 質点
    θE dup mul θI θ0 vsub dup prod EPS add div θI θ0 vsub smul θI exch vsub
    % singular isothermal sphere
    %θE θI θ0 vsub dup prod EPS add sqrt div θI θ0 vsub smul θI exch vsub
    end
} def
% 背景の θs の場所の色で、θI の位置に点を打つ
/plot {
    2 dict begin
    /θs exch def
    /θI exch def
    % 模様
    % 市松模様
    %θs 0 get 10 div cvi θs 1 get 10 div cvi add 2 mod 0 eq {1}{0} ifelse setgray
    % 丸
    θs [50 50] vsub dup prod 25 lt { 1 } { 0 } ifelse setgray

    θI 0 get θI 1 get 1 1 rectfill
    end
} def

% 2次元ベクトルの演算
% 和
/vadd {
    3 dict begin
    /v2 exch def
    /v1 exch def
    [0 0]
    0 1 1 {
        /i exch def
        dup
        v1 i get v2 i get add i exch put
    } for
    end
} def
% 差
/vsub {
    3 dict begin
    /v2 exch def
    /v1 exch def
    [0 0]
    0 1 1 {
        /i exch def
        dup
        v1 i get v2 i get sub i exch put
    } for
    end
} def
% 内積
/prod {
    3 dict begin
    /v2 exch def
    /v1 exch def
    0
    0 1 1 {
        /i exch def
        v1 i get v2 i get mul add
    } for
    end
} def
% スカラー倍
/smul {
    3 dict begin
    /v exch def
    /s exch def
    [0 0]
    0 1 1 {
        /i exch def
        dup
        s v i get mul i exch put
    }for
    end
} def

100 {
    % 像を描く
    %θI 像の位置
    %θs 背景での位置
    0 1 100 {
        /xI exch def
        0 1 100 {
            /yI exch def
            /θI [xI yI] def
            /θs θI θ0 θItoθs def
            θI θs plot
        } for
    } for
    showpage
    /θ0 θ0 dθ vadd def
} repeat
grestore