手書き 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