[ 備忘録 ] MetaPost で図を描こうと思ったのが苦労の始まり。描こうとした図は次のもの。点Oを中心とする円、円内の点A、そして円周上の2点P、Qを、∠PAQが直角となるように描くこと。
普通のお絵描きソフトを使わない理由はいろいろあるが、直角となる条件を自動的に処理させたいことも、その一つ。ところが MetaPost は連立1次方程式しか解けないので、円と直線の交点を求めさせることができない(多分・・・)。まあ、交点は2つあるから自動処理でどちらかを選ぶのは難しいのかなあ、とは思う。だから、O、A、Pの3点を定めてから点Qを計算で求めようとすると上手く行かない(多分・・・)。そこで作戦変更。円の中心Oを最後に求めるようにした。結局のところ、正確な図が欲しいわけで、OAの長さが前もって指定されているわけではないのだから、今回の目的のためにはこれで良い。
ということで、手順は次の通り。点AとベクトルAPを定める。ベクトルAPを90度回転して、何倍かすることにより点Qを定める。線分PQの中点Mを求める。Mを通りPQに垂直な直線上に円の中心はあるので、この直線と点Aを通る直線(これは適当に選ぶ)の交点として、中心Oを定める。今回はAを通る水平線との交点としてOを求めた。
ベクトルAPと、AP : AQ の比率を変化させることで、見やすい図にできる。MetaPostプログラムは以下のようになる。
z.A=(0,0); % 点Aを定める
z.P-z.A=(4u,u); % ベクトルAPを定める。uは適当に定めた単位長
z.Q-z.A=0.5*(z.P-z.A) rotated 90; % APを90度回転して0.5倍したものをAQとする。
z.M=0.5[z.P, z.Q]; % PQの中点をMとする。
z.O-z.M=whatever*(z.Q-z.P) rotated 90; % OMはPQと垂直になるようにせよ(方程式)
z.O-z.A=whatever*(1,0); % OAはベクトル(1,0)と平行に(方程式)