2016-09-22 15 views
1

私は基本的な数学についてどれほど知っているかわかりません。基本的に私が持っているのは原点(0,0,0)、円の半径(10)、私は両方の角度(thetaとphi)を知っています。この仮定を仮定すると、私は球上の投影点を計算したいと思います。私はhttps://stackoverflow.com/a/969880/1230358https://stackoverflow.com/a/36369852/1230358http://tutorial.math.lamar.edu/Classes/CalcII/SphericalCoords.aspxhttps://en.wikipedia.org/wiki/Spherical_coordinate_systemという答えを読んで下のコードを思いついた。球座標の計算

私の現在のコード:

#!/usr/bin/env python3 
import math 


PI = math.pi 
PI_2 = PI/2 

def calc_sphere_coordinates(radius, phi, theta): 
    # see: https://stackoverflow.com/a/969880/1230358 
    # see: https://stackoverflow.com/q/19673067/1230358 
    # see: http://mathinsight.org/spherical_coordinates 
    # see: https://en.wikipedia.org/wiki/Spherical_coordinate_system 
    # see: http://tutorial.math.lamar.edu/Classes/CalcII/SphericalCoords.aspx 

    # φ phi is the polar angle, rotated down from the positive z-axis (slope) 
    # θ theta is azimuthal angle, the angle of the rotation around the z-axis (aspect) 

    # z   
    # | x 
    # |/
    # |/ 
    # +-------- y 

    # both angles need to be in radians, not degrees! 
    theta = theta * PI/180 
    phi = phi * PI/180 

    x = radius * math.sin(phi) * math.cos(theta) 
    y = radius * math.sin(phi) * math.sin(theta) 
    z = radius * math.cos(phi) 
    return (x, y, z) 

if __name__ == "__main__": 

    # calculate point position in hemisphere by rotating down from positive z-axis 
    for i in (10, 20, 30, 40, 50, 60, 70 , 80, 90): 
     print(calc_sphere_coordinates(10, i, 0)) 

    print("-"*10) 

    # calculate point position in hemisphere by rotating around the z axis 
    for i in (10, 20, 30, 40, 50, 60, 70 , 80, 90): 
     print(calc_sphere_coordinates(10, 0, i)) 

    print("-"*10) 

    # calculate point position by rotating in both directions 
    for i in (10, 20, 30, 40, 50, 60, 70 , 80, 90): 
     print(calc_sphere_coordinates(10, i, 90-i))  

次のようにコードの出力である:

(1.7364817766693033, 0.0, 9.84807753012208) 
(3.420201433256687, 0.0, 9.396926207859085) 
(4.999999999999999, 0.0, 8.660254037844387) 
(6.4278760968653925, 0.0, 7.660444431189781) 
(7.66044443118978, 0.0, 6.427876096865393) 
(8.660254037844386, 0.0, 5.000000000000001) 
(9.396926207859083, 0.0, 3.4202014332566884) 
(9.84807753012208, 0.0, 1.7364817766693041) 
(10.0, 0.0, 6.123233995736766e-16) 
---------- 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
(0.0, 0.0, 10.0) 
---------- 
(0.30153689607045814, 1.7101007166283433, 9.84807753012208) 
(1.16977778440511, 3.2139380484326963, 9.396926207859085) 
(2.5, 4.330127018922192, 8.660254037844387) 
(4.131759111665348, 4.92403876506104, 7.660444431189781) 
(5.868240888334652, 4.92403876506104, 6.427876096865393) 
(7.5, 4.330127018922192, 5.000000000000001) 
(8.83022221559489, 3.2139380484326963, 3.4202014332566884) 
(9.69846310392954, 1.7101007166283433, 1.7364817766693041) 
(10.0, 0.0, 6.123233995736766e-16) 

enter image description here

(10.0, 0.0, 6.123233995736766e-16)の行は0の-Z座標べきではありませんでした6.123233995736766e-16ではなく?また、z軸を中心に回転すると、どの角度を使用しても常に同じ結果になります(0.0, 0.0, 10.0)

答えて

0

私の知る限り、あなたのコードは正常に動作しています。正直言って、6.123233995736766e-16はすべての実際のアプリケーションでかなり0であると認めなければなりません。

あなたの質問はmath.cos(math.pi/2.0)がゼロ

等しい理由は浮動小数点数は、コンピュータで生成され、保存されている方法で発見されていない理由を

に沸きます。 Pythonで0.1+0.2を計算してみてください。サプリメント?あなたがもっと知りたいのであれば、google 浮動小数点エラーまたは何か関連しているだけです。

+0

すべての権利は、奇妙なことに私はこの問題を認識したことはありません。確かに、私は少し驚いている:)!それでも、z軸回りの回転には1つの問題があると思います。私は問題をよりよく説明するためにグラフを追加しました。 z軸(2番目のグラフ)を中心に回転すると常に同じ値( ''(0.0、0.0、10.0) '' 'を返すため、すべての点が同じ位置にあるので、私の計算式は大丈夫だとは思わない) 。最初のチャートのように素敵な弓の中に散らばってはいけませんが、z軸の周りに配置されるべきですか? – hetsch

+0

@hetsch私が言ったように、方程式は大丈夫です。 2番目のチャートでは、すでにこの軸上に座っているz軸についての点を回転させているので、その位置にとどまります。たぶんあなたは '[15,30,45,60,75,90]]やそれに似たものでprint_ calc_sphere_coordinates(10,90、i)を試してみてください。 – ImportanceOfBeingErnest

関連する問題