2017-05-05 6 views
0

私はJavaスクリプト(私は初心者です)からPython(中間レベル)にコードを変換しています。このコードには、条件付き(3値)演算子の形式でif文が含まれています。"奇妙な"三項演算子をJavaスクリプトからPythonに変換する

コードの行はこれです:

// if dLon over 180° take shorter rhumb line across the anti-meridian: 
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ); 

私は、次のされdefinition of ternary operatorを知っている:

条件? expr1の:expr2の

しかし、私はどのように解釈するか分からない余分な "条件" としての私のコード:現時点ではΔλ = Δλ>0

は私のPythonのバージョンは、次のようになります

import numpy as np 
# note: delta_lon = Δλ 
if np.abs(delta_lon) > np.pi: 
      delta_lon = -(2*np.pi - delta_lon) 
     else: 
      delta_lon = 2*np.pi + delta_lon 

しかし、それは間違った結果を与えるようです。私は問題が以前に言及された "条件"によって与えられていると思います。実際には変数delta_lonを再定義しています。

コード全体は、linkの欄の行間隔のセクションにあります。

EDIT: ここでは、私はJavaScriptから変換しようとしている完全なコードです:

var Δψ = Math.log(Math.tan(Math.PI/4+φ2/2)/Math.tan(Math.PI/4+φ1/2)); 
var q = Math.abs(Δψ) > 10e-12 ? Δφ/Δψ : Math.cos(φ1); // E-W course becomes ill-conditioned with 0/0 

// if dLon over 180° take shorter rhumb line across the anti-meridian: 
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ); 

var dist = Math.sqrt(Δφ*Δφ + q*q*Δλ*Δλ) * R; 

私は前述のif文を除いてほぼ全コードを変換することができました。もし私がこの文を書いていなければ、私のpythonコードはJavaScriptコードと同じ結果を返します(良い入力値を使っているからというだけでOKです)。しかし、私が上に示した行を追加すると、私はもう同じ結果を得られません。これは、三項演算子が間違った方法で翻訳されたことを示します。

+0

あなたのPythonコードは実際に私にはよく見えます。結果に「間違っている」ことを詳しく説明できますか? –

+0

'np.pi'はどのライブラリから来たのですか?なぜあなたは' math'ライブラリを使用していませんか? –

+0

よくpythonで私は通常numpをnp ....と使います。したがって3.14 = np.pi ....数学ライブラリも使うことができますが、大したことではありませんか? –

答えて

0

あなたはコードの意図を誤解しています。 Δλは、[-pi、pi]の外側にある場合にのみ変更し、その符号に応じて異なる方向に移動する必要があります。 JavaScriptコードを翻訳することは

if np.abs(delta_lon) > np.pi: 
    delta_lon = -(2*np.pi - delta_lon) if delta_lon > 0 else 2*np.pi + delta_lon 

代わりに使用すると、同じ効果を持つ

if delta_lon > np.pi: 
    delta_lon = -(2*np.pi - delta_lon) 
elif delta_lon < -np.pi: 
    delta_lon = 2*np.pi + delta_lon 

を行うことができますを提供します。