極座標 to デカルト座標

極座標(r,θ)は、通常の座標(デカルト座標・正規直交座標)と違い、放射状・同心円状に軸が伸びている感じの座標系です。極座標とデカルト座標との関係は次のようになっています:

x=rcosθ, y=rsinθ

# 「1,PIをX,Yへデカルト座標変換」のように使う
●デカルト座標変換(R,θを{参照渡し}X,{参照渡し}Yに|Yへ)
 X = R * COS(θ)
 Y = R * SIN(θ)

一部の特殊な図形などは、極座標系で表現した方が分かりやすいことも多いです。例えば、半径 a で原点中心の円は、方程式 r=a で表されます。

デカルト座標 to 極座標

極座標からデカルト座標への変換は定義通りに実装すれば簡単にできますが、逆は少し厄介です。偏角θ(点(X,Y)がX軸と為す角度)の計算が面倒だからです。

偏角

基本的には、 ARCTAN 関数[*1]で偏角を求めます。 X>0 のときは ARCTAN(Y/X) で OK です。しかし、 ARCTAN では求めたい偏角が ±π/2 のとき、つまり X=0 のときに対応できません(ゼロ除になるため)。また、X<0のときも(πだけずれた)真逆の角度になってしまいます。

そのため、とにかく細かく条件分岐して実装します:

!HALF_PIとは数値=PI/2

●偏角(X,Yの)
 もしXが0ならば
  もしY>0ならば
   HALF_PIを戻す
  違えば # もしY≦0ならば
   -HALF_PIを戻す
 違えば、もしX>0ならば
  ARCTAN(Y/X)を戻す
 違えば # もしX<0ならば
  ARCTAN(Y/X)+PIを戻す

この関数の値域(結果の範囲)は、 [-π/2,3π/2) と、少しトリッキーです。計算上はこれで問題ないですが、より一般的な偏角の区間 [-π,π) に収めたい場合は、もう一段階場合分けを増やす必要があります:

!HALF_PIとは数値=PI/2

●偏角(X,Yの)
 もしXが0ならば
  もしY>0ならば
   HALF_PIを戻す
  違えば # もしY≦0ならば
   -HALF_PIを戻す
 違えば、もしX>0ならば
  ARCTAN(Y/X)を戻す
 違えば # もしX<0ならば
  もし、Y>0ならば
   ARCTAN(Y/X)+PIを戻す
  違えば # もしY≦0ならば
   ARCTAN(Y/X)-PIを戻す

もし [0,2π) など、もっと他の区間で結果を求めたい場合は、適宜改造して使って下さい[*2]

極座標変換

これで一番ネックとなっていた偏角を計算する問題が解決したので、デカルト座標から極座標への変換も簡単です:

# 「100,200をR,θへ極座標変換」と使う
●極座標変換(X,Yを{参照渡し}R,{参照渡し}θへ|θに)
 R=HYPOT(X,Y)。# = √(X^2+Y^2)
 θ=X,Yの偏角

但し、当然ですが「偏角」命令を利用するので、同じプログラム内に上で作った「偏角」命令の定義がないといけません[*3]。偏角を求める関数は2種類作りましたが、好きな方(だけ)を使って下さい。

注釈

*1
ARCTAN は、 TAN の逆関数で、その値域は (-π/2,π/2) です。簡単に説明すると、直角三角形ABC(∠ABC=90°)で、∠CAB = ARCTAN( BC/AB ) となります。
*2
もちろん、 R/2πZ を扱う専用のグループや命令を作ってもいいのですが、あまり有用性がないので、ここではそこまで踏み込みません。
*3
同じプログラム内になくても、システム命令「取り込む」で取り込んだプログラムに(同じ仕様の)「偏角」命令が定義してあれば問題ありません。再利用できそうな関数やグループなどのパーツは、適宜別ファイルにして取り込み用のモジュールにしておくといいでしょう。