球面坐标的计算

时间:2016-09-22 19:49:59

标签: python math 3d trigonometry

我不得不说,我对基本数学知之甚少感到害怕和惊讶。基本上我所拥有的是原点(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的答案,提出了底层代码。

我目前的代码:

,     //Match a comma
(?!   //Negative look-ahead. We want to match a comma NOT followed by...
[^(]* //Any number of characters NOT '(', zero or more times
/)    //Followed by the ')' character
)     //Close the lookahead.

代码的输出如下:

#!/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))    

enter image description here

(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) 的行不应该是(10.0, 0.0, 6.123233995736766e-16)而不是0的z坐标吗?无论使用什么角度6.123233995736766e-16,围绕z轴旋转都会得到相同的结果。

1 个答案:

答案 0 :(得分:0)

据我所知,你的代码运行得很好。老实说,人们不得不承认6.123233995736766e-16对于所有真实应用来说几乎都是0,对吗?

你的问题归结为

为什么math.cos(math.pi / 2.0)不等于零

原因在于如何生成浮点数并将其存储在计算机中。尝试在python中计算0.1+0.2。 Supprised?如果您想了解更多,只需谷歌浮点错误或任何相关的内容。