home changes contents help options

185:直行座標を極座標に変換する

直行座標を極座標に

float 型の変数 x, y で示されている直交座標の極座標への変換は次のようになります。

>>> import math
>>> x = 3.0
>>> y = 4.0
>>> math.sqrt(x ** 2 + y ** 2) # 原点からの距離(動径)
5.0
>>> math.hypot(x, y)           # 原点からの距離(動径)、よりシンプルな答え
5.0
>>> math.atan(y / x)           # 偏角
0.92729521800161219
>>> math.atan2(y, x)           # 偏角、別解。負の値のときの戻り値が一応異なる
0.92729521800161219

math モジュールの関数を1つ呼ぶだけで目的を達成できてしまうので蛇足といえなくもないですが、 関数にすると次のようになります。

import math

def xy_abs(x, y):
    u"""
    原点からの距離(動径)を返す
    """
    return math.hypot(x, y) 

def xy_arg(x, y):
    u"""
    偏角を返す
    """
    return math.atan(y / x)

def xy_polar(x, y):
    u"""
    極座標表示を返す
    """
    return xy_abs(x, y), xy_arg(x, y)

複素数平面

直交座標が複素数で示されているならば次のようになります。

>>> import math
>>> z = complex(3.0, 4.0)
>>> math.sqrt(z.real ** 2 + z.imag ** 2) # 原点からの距離(動径)
5.0
>>> abs(z)                               # 原点からの距離(動径)、よりシンプルな答え
5.0
>>> math.atan(z.imag/z.real)             # 偏角
0.92729521800161219
>>> import cmath
>>> cmath.log(z/abs(z)).imag             # 偏角、別解
0.92729521800161219

こちらも蛇足ではありますが、関数にしておきます。

import math

def complex_abs(z):
    u"""
    原点からの距離(動径)を返す
    """
    return abs(z)

def complex_arg(z):
    u"""
    偏角を返す
    """
    return math.atan(z.imag / z.real)

def complex_polar(z):
    u"""
    極座標表示を返す
    """
    return complex_abs(z), complex_arg(z)